复制活动记录记录的最简单方法是什么?
时间:2020-03-05 18:52:33 来源:igfitidea点击:
我想制作一个activerecord记录的副本,在此过程中更改单个字段(除了id之外)。最简单的方法是什么?
我意识到我可以创建一个新记录,然后遍历每个字段,逐字段复制数据,但我认为必须有一种更简单的方法来执行此操作...
如:
@newrecord=Record.copy(:id) *perhaps?*
解决方案
回答
要获得副本,请使用clone(或者dup for rails 3.1)方法:
# rails < 3.1 new_record = old_record.clone #rails >= 3.1 new_record = old_record.dup
然后,我们可以更改所需的任何字段。
ActiveRecord会覆盖内置的Object#clone,从而为我们提供一个具有未分配ID的新记录(未保存到DB)。
请注意,它不会复制关联,因此如果需要,我们将必须手动执行此操作。
Rails 3.1 clone是一个浅表副本,请改用dup ...
回答
我通常只是复制属性,更改我需要更改的内容:
new_user = User.new(old_user.attributes.merge(:login => "newlogin"))
回答
根据需求和编程风格,我们还可以结合使用类的新方法和合并。由于缺少更好的简单示例,假设我们已将任务安排在某个日期,并且我们想将其复制到另一个日期。任务的实际属性并不重要,因此:
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,我们将必须显式调用save,因此,如果要自动保存,请将Task.new更改为Task.create。
和平。