我想做一个ActiveRecord对象的副本,改变进程中的一个字段(除了id)。要做到这一点,最简单的方法是什么?
我意识到我可以创建一个新记录,然后遍历每个字段,逐字段复制数据—但我认为一定有更简单的方法来做到这一点。
也许是这样的:
new_record = Record.copy(:id)
我想做一个ActiveRecord对象的副本,改变进程中的一个字段(除了id)。要做到这一点,最简单的方法是什么?
我意识到我可以创建一个新记录,然后遍历每个字段,逐字段复制数据—但我认为一定有更简单的方法来做到这一点。
也许是这样的:
new_record = Record.copy(:id)
当前回答
我通常只是复制属性,改变任何我需要改变的:
new_user = User.new(old_user.attributes.merge(:login => "newlogin"))
其他回答
根据您的需要和编程风格,还可以结合使用类的新方法和merge。由于缺乏更好的简单示例,假设您有一个计划在某个日期执行的任务,并且希望将其复制到另一个日期。任务的实际属性并不重要,所以:
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,所有其他属性与原始任务相同。使用任务。new,你必须显式调用save,所以如果你想自动保存它,改变任务。new to Task.create。
和平。
简单的方法是:
#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 5中,您可以像这样简单地创建重复的对象或记录。
new_user = old_user.dup
您还可以检查acts_as_inheritable gem。
Acts As Inheritable是一个Ruby Gem,专门为Rails/ActiveRecord模型编写。它意味着与自引用关联一起使用,或者与具有共享可继承属性的父级的模型一起使用。这将允许您从父模型继承任何属性或关系。”
通过将acts_as_inheritable添加到您的模型中,您将可以访问这些方法:
inherit_attributes
class Person < ActiveRecord::Base
acts_as_inheritable attributes: %w(favorite_color last_name soccer_team)
# Associations
belongs_to :parent, class_name: 'Person'
has_many :children, class_name: 'Person', foreign_key: :parent_id
end
parent = Person.create(last_name: 'Arango', soccer_team: 'Verdolaga', favorite_color:'Green')
son = Person.create(parent: parent)
son.inherit_attributes
son.last_name # => Arango
son.soccer_team # => Verdolaga
son.favorite_color # => Green
inherit_relations
class Person < ActiveRecord::Base
acts_as_inheritable associations: %w(pet)
# Associations
has_one :pet
end
parent = Person.create(last_name: 'Arango')
parent_pet = Pet.create(person: parent, name: 'Mango', breed:'Golden Retriver')
parent_pet.inspect #=> #<Pet id: 1, person_id: 1, name: "Mango", breed: "Golden Retriver">
son = Person.create(parent: parent)
son.inherit_relations
son.pet.inspect # => #<Pet id: 2, person_id: 2, name: "Mango", breed: "Golden Retriver">
希望这能帮助到你。
我通常只是复制属性,改变任何我需要改变的:
new_user = User.new(old_user.attributes.merge(:login => "newlogin"))