复制活动记录记录的最简单方法是什么?

时间: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。

和平。