ruby on rails - একটি activrecord রেকর্ড নকল করার সবচেয়ে সহজ উপায় কি?



ruby-on-rails rails-activerecord (8)

Rails 5 এ আপনি সহজেই অনুরূপ বস্তু বা রেকর্ড তৈরি করতে পারেন।

new_user = old_user.dup

https://ffff65535.com

আমি একটি activerecord রেকর্ডের একটি অনুলিপি তৈরি করতে চাই, প্রক্রিয়াতে একটিও ক্ষেত্র পরিবর্তন ( আইডি ছাড়াও)। এই সাধন করার সবচেয়ে সহজ উপায় কি?

আমি বুঝতে পারি যে আমি একটি নতুন রেকর্ড তৈরি করতে পারি এবং তারপরে ক্ষেত্রের ক্ষেত্র-ক্ষেত্র-ক্ষেত্রের অনুলিপি করা প্রতিটি ক্ষেত্রের উপর পুনরাবৃত্তি করতে পারি - কিন্তু আমি মনে করি এটি করার সহজ উপায় অবশ্যই আছে ...

যেমন:

 @newrecord=Record.copy(:id)  *perhaps?*

আপনার প্রয়োজন এবং প্রোগ্রামিং শৈলী উপর নির্ভর করে, আপনি ক্লাসের নতুন পদ্ধতির সমন্বয় এবং একত্রিত করতে পারেন। একটি ভাল সহজ উদাহরণ অভাবের জন্য, অনুমান করুন আপনার নির্দিষ্ট নির্দিষ্ট তারিখের জন্য নির্ধারিত একটি টাস্ক আছে এবং আপনি এটি অন্য কোনও তারিখে অনুলিপি করতে চান। টাস্ক প্রকৃত বৈশিষ্ট্য গুরুত্বপূর্ণ নয়, তাই:

old_task = Task.find(task_id)
new_task = Task.new(old_task.attributes.merge({:scheduled_on => some_new_date}))

এর সাথে একটি নতুন টাস্ক তৈরি করবে :id => nil :scheduled_on => some_new_date , এবং অন্যান্য সমস্ত বৈশিষ্ট্যগুলি আসল কাজ হিসাবে একই। Task.new ব্যবহার করে, আপনাকে স্পষ্টভাবে সংরক্ষণ কল করতে হবে, তাই আপনি যদি এটি স্বয়ংক্রিয়ভাবে সংরক্ষণ করতে চান তবে Task.new টাস্ক.create তে পরিবর্তন করুন।

শান্তি বর্ষিত হোক।


আপনি ActiveRecord 3.2 এর জন্য অ্যামোবা মোম পছন্দ করতে পারেন।

আপনার ক্ষেত্রে, সম্ভবত আপনি কনফিগারেশন DSL এ উপলব্ধ regex , regex বা prefix বিকল্পগুলি ব্যবহার করতে চান।

এটি has_one , has_many এবং has_and_belongs_to_many সংস্থার সহজ এবং স্বয়ংক্রিয় has_many has_one সমর্থন করে, ক্ষেত্র has_and_belongs_to_many এবং একটি অত্যন্ত নমনীয় এবং শক্তিশালী কনফিগারেশন DSL যা মডেল এবং ফ্লাই উভয় ক্ষেত্রে প্রয়োগ করা যেতে পারে।

Amoeba ডকুমেন্টেশন চেক আউট নিশ্চিত করুন কিন্তু ব্যবহার বেশ সহজ ...

মাত্র

gem install amoeba

অথবা যোগ করুন

gem 'amoeba'

আপনার Gemfile যাও

তারপরে আপনার মডেলের অ্যামোব ব্লক যুক্ত করুন এবং স্বাভাবিক হিসাবে dup পদ্ধতিটি চালান

class Post < ActiveRecord::Base
  has_many :comments
  has_and_belongs_to_many :tags

  amoeba do
    enable
  end
end

class Comment < ActiveRecord::Base
  belongs_to :post
end

class Tag < ActiveRecord::Base
  has_and_belongs_to_many :posts
end

class PostsController < ActionController
  def some_method
    my_post = Post.find(params[:id])
    new_post = my_post.dup
    new_post.save
  end
end

আপনি বিভিন্ন ক্ষেত্রগুলিতে কোন ক্ষেত্রগুলি অনুলিপি করতে পারেন তা নিয়ন্ত্রণ করতে পারেন, কিন্তু উদাহরণস্বরূপ, যদি আপনি সদৃশ হওয়া থেকে মন্তব্যগুলি আটকাতে চেয়েছিলেন তবে আপনি একই ট্যাগগুলি বজায় রাখতে চেয়েছিলেন তবে আপনি এমন কিছু করতে পারেন:

class Post < ActiveRecord::Base
  has_many :comments
  has_and_belongs_to_many :tags

  amoeba do
    exclude_field :comments
  end
end

আপনি ক্ষেত্রগুলি preprocess করতে পারেন উভয় উপসর্গ এবং প্রতিক্রিয়া পাশাপাশি regexes সঙ্গে স্বতন্ত্রতা নির্দেশ সাহায্য। এছাড়া, আপনার বিকল্পের জন্য সর্বাধিক পঠনযোগ্য শৈলীতে লিখতে পারেন এমন অসংখ্য বিকল্প রয়েছে:

class Post < ActiveRecord::Base
  has_many :comments
  has_and_belongs_to_many :tags

  amoeba do
    include_field :tags
    prepend :title => "Copy of "
    append :contents => " (copied version)"
    regex :contents => {:replace => /dog/, :with => "cat"}
  end
end

অ্যাসোসিয়েশনের recursive অনুলিপি সহজ, শুধু শিশু মডেলের উপর amoeba সক্ষম হিসাবে

class Post < ActiveRecord::Base
  has_many :comments

  amoeba do
    enable
  end
end

class Comment < ActiveRecord::Base
  belongs_to :post
  has_many :ratings

  amoeba do
    enable
  end
end

class Rating < ActiveRecord::Base
  belongs_to :comment
end

কনফিগারেশন DSL এখনো আরো বিকল্প আছে, তাই ডকুমেন্টেশন চেক আউট নিশ্চিত করুন।

উপভোগ করুন! :)


আপনি যদি অ্যাসোসিয়েশনের সাথে একটি গভীর অনুলিপি প্রয়োজন, আমি deep_cloneable মণি সুপারিশ।


একটি অনুলিপি পেতে, ক্লোনটি ব্যবহার করুন (বা রেলের জন্য ডুপ 3.1) পদ্ধতি:

# rails < 3.1
new_record = old_record.clone

#rails >= 3.1
new_record = old_record.dup

তারপর আপনি যে কোন ক্ষেত্র পরিবর্তন করতে পারেন।

ActiveRecord আপনাকে একটি নতুন নথি (ডিবিতে সংরক্ষিত নয়) নথিভুক্ত আইডি দিয়ে রেকর্ড করার জন্য অন্তর্নির্মিত বস্তু # ক্লোনকে ওভাররাইড করে
মনে রাখবেন যে এটি সংস্থানগুলি অনুলিপি করে না, তাই যদি আপনাকে প্রয়োজন হয় তবে আপনাকে এটি নিজে করতে হবে।

রেল 3.1 ক্লোন একটি অগভীর কপি, পরিবর্তে সদৃশ ব্যবহার করুন ...


এখানে ইনস্ট্যান্স #dup কাস্টমাইজ করার জন্য ActiveRecord #dup পদ্ধতি ওভাররাইড করার একটি নমুনা রয়েছে এবং সম্পর্কের সদৃশ অন্তর্ভুক্ত রয়েছে:

class Offer < ApplicationRecord
  has_many :offer_items

  def dup
    super.tap do |new_offer|

      # change title of the new instance
      new_offer.title = "Copy of #{@offer.title}"

      # duplicate offer_items as well
      self.offer_items.each { |offer_item| new_offer.offer_items << offer_item.dup }
    end
  end
end

দ্রষ্টব্য: এই পদ্ধতিতে কোন বহিরাগত মণির প্রয়োজন নেই তবে এটি # #dup পদ্ধতিতে প্রয়োগ করা নতুন পদ্ধতির প্রয়োজন


যেহেতু আরো যুক্তি থাকতে পারে, যখন মডেলটিকে অনুলিপি করা হয়, তখন আমি একটি নতুন বর্গ তৈরি করার পরামর্শ দেব, যেখানে আপনি সমস্ত প্রয়োজনীয় যুক্তি পরিচালনা করবেন। যে সহজ করতে, একটি মণি যে সাহায্য করতে পারেন: clowne

একটি ব্যবহারকারী মডেলের জন্য তাদের নথির উদাহরণ অনুযায়ী:

class User < ActiveRecord::Base
  # create_table :users do |t|
  #  t.string :login
  #  t.string :email
  #  t.timestamps null: false
  # end

  has_one :profile
  has_many :posts
end

আপনি আপনার ক্লোনার ক্লাস তৈরি করুন:

class UserCloner < Clowne::Cloner
  adapter :active_record

  include_association :profile, clone_with: SpecialProfileCloner
  include_association :posts

  nullify :login

  # params here is an arbitrary Hash passed into cloner
  finalize do |_source, record, params|
    record.email = params[:email]
  end
end

class SpecialProfileCloner < Clowne::Cloner
  adapter :active_record

  nullify :name
end

এবং তারপর এটি ব্যবহার করুন:

user = User.last
#=> <#User(login: 'clown', email: '[email protected]')>

cloned = UserCloner.call(user, email: '[email protected]')
cloned.persisted?
# => false

cloned.save!
cloned.login
# => nil
cloned.email
# => "[email protected]"

# associations:
cloned.posts.count == user.posts.count
# => true
cloned.profile.name
# => nil

উদাহরণটি প্রকল্প থেকে অনুলিপি করা হয়েছে, তবে এটি আপনি কী অর্জন করতে পারেন তার একটি স্পষ্ট দর্শন দেবে।

একটি দ্রুত এবং সহজ রেকর্ডের জন্য আমি সঙ্গে যেতে হবে:

Model.new(Model.last.attributes.reject {|k,_v| k.to_s == 'id'}


সহজে উপায় হল:

#your rails >= 3.1 (i was done it with Rails 5.0.0.1)
  o = Model.find(id)
 # (Range).each do |item|
 (1..109).each do |item|
   new_record = o.dup
   new_record.save
 end

অথবা

# if your rails < 3.1
 o = Model.find(id)
 (1..109).each do |item|
   new_record = o.clone
   new_record.save
 end     




rails-activerecord