我想做一个ActiveRecord对象的副本,改变进程中的一个字段(除了id)。要做到这一点,最简单的方法是什么?
我意识到我可以创建一个新记录,然后遍历每个字段,逐字段复制数据—但我认为一定有更简单的方法来做到这一点。
也许是这样的:
new_record = Record.copy(:id)
我想做一个ActiveRecord对象的副本,改变进程中的一个字段(除了id)。要做到这一点,最简单的方法是什么?
我意识到我可以创建一个新记录,然后遍历每个字段,逐字段复制数据—但我认为一定有更简单的方法来做到这一点。
也许是这样的:
new_record = Record.copy(:id)
当前回答
我通常只是复制属性,改变任何我需要改变的:
new_user = User.new(old_user.attributes.merge(:login => "newlogin"))
其他回答
下面是一个覆盖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
注意:这个方法不需要任何外部宝石,但它需要更新的ActiveRecord版本,实现了#dup方法
简单的方法是:
#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
Or
# if your rails < 3.1
o = Model.find(id)
(1..109).each do |item|
new_record = o.clone
new_record.save
end
试试rails的dup方法:
new_record = old_record.dup.save
如果你不想复制id,使用ActiveRecord::Base#dup
要获得副本,使用dup(或clone for < rails 3.1+)方法:
#rails >= 3.1
new_record = old_record.dup
# rails < 3.1
new_record = old_record.clone
然后您可以更改任何您想要的字段。
ActiveRecord覆盖了内置的object#克隆,为您提供了一个新的(未保存到DB)记录,该记录具有未分配的ID。 请注意,它不会复制关联,因此如果需要,您必须手动执行此操作。
Rails 3.1克隆是一个浅拷贝,使用dup代替…