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

我想制作一个activerecord记录的副本,更改进程中的单个字段(除了id)。实现这一目标的最简单方法是什么?

我意识到我可以创建一个新记录,然后遍历每个字段逐个复制数据 - 但我认为必须有一个更简单的方法来做到这一点......

如:

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


智慧大石
浏览 576回答 3
3回答

达令说

要获取副本,请使用克隆(或dup for rails 3.1)方法:#&nbsp;rails&nbsp;<&nbsp;3.1new_record&nbsp;=&nbsp;old_record.clone#rails&nbsp;>=&nbsp;3.1new_record&nbsp;=&nbsp;old_record.dup然后你可以改变你想要的任何字段。ActiveRecord会覆盖内置的Object#clone,为您提供一个带有未分配ID的新记录(未保存到数据库)。请注意,它不会复制关联,因此如果需要,您必须手动执行此操作。Rails 3.1 clone是一个浅拷贝,使用dup代替...

神不在的星期二

您可能也喜欢ActiveRecord 3.2&nbsp;的Amoeba宝石。在你的情况,你可能想使用的nullify,regex或prefix在配置DSL可用的选项。它支持的简单和自动递归重复has_one,has_many和has_and_belongs_to_many协会,现场预处理和既能对模型和动态应用了灵活而强大的配置DSL。请务必查看Amoeba文档,但使用非常简单......只是gem&nbsp;install&nbsp;amoeba或添加gem&nbsp;'amoeba'到你的Gemfile然后将变形虫块添加到模型中并dup像往常一样运行方法class&nbsp;Post&nbsp;<&nbsp;ActiveRecord::Base &nbsp;&nbsp;has_many&nbsp;:comments &nbsp;&nbsp;has_and_belongs_to_many&nbsp;:tags &nbsp;&nbsp;amoeba&nbsp;do &nbsp;&nbsp;&nbsp;&nbsp;enable&nbsp;&nbsp;endendclass&nbsp;Comment&nbsp;<&nbsp;ActiveRecord::Base &nbsp;&nbsp;belongs_to&nbsp;:postendclass&nbsp;Tag&nbsp;<&nbsp;ActiveRecord::Base &nbsp;&nbsp;has_and_belongs_to_many&nbsp;:postsendclass&nbsp;PostsController&nbsp;<&nbsp;ActionController &nbsp;&nbsp;def&nbsp;some_method &nbsp;&nbsp;&nbsp;&nbsp;my_post&nbsp;=&nbsp;Post.find(params[:id]) &nbsp;&nbsp;&nbsp;&nbsp;new_post&nbsp;=&nbsp;my_post.dup &nbsp;&nbsp;&nbsp;&nbsp;new_post.save&nbsp;&nbsp;endend您还可以控制以多种方式复制哪些字段,但是,例如,如果您希望防止注释被复制但是您想要维护相同的标记,则可以执行以下操作:class&nbsp;Post&nbsp;<&nbsp;ActiveRecord::Base &nbsp;&nbsp;has_many&nbsp;:comments &nbsp;&nbsp;has_and_belongs_to_many&nbsp;:tags &nbsp;&nbsp;amoeba&nbsp;do &nbsp;&nbsp;&nbsp;&nbsp;exclude_field&nbsp;:comments&nbsp;&nbsp;endend您还可以预处理字段,以帮助指示前缀和后缀以及正则表达式的唯一性。此外,还有许多选项,因此您可以为您的目的以最易读的方式编写:class&nbsp;Post&nbsp;<&nbsp;ActiveRecord::Base &nbsp;&nbsp;has_many&nbsp;:comments &nbsp;&nbsp;has_and_belongs_to_many&nbsp;:tags &nbsp;&nbsp;amoeba&nbsp;do &nbsp;&nbsp;&nbsp;&nbsp;include_field&nbsp;:tags &nbsp;&nbsp;&nbsp;&nbsp;prepend&nbsp;:title&nbsp;=>&nbsp;"Copy&nbsp;of&nbsp;" &nbsp;&nbsp;&nbsp;&nbsp;append&nbsp;:contents&nbsp;=>&nbsp;"&nbsp;(copied&nbsp;version)" &nbsp;&nbsp;&nbsp;&nbsp;regex&nbsp;:contents&nbsp;=>&nbsp;{:replace&nbsp;=>&nbsp;/dog/,&nbsp;:with&nbsp;=>&nbsp;"cat"} &nbsp;&nbsp;endend关联的递归复制很容易,也可以在子模型上启用变形虫class&nbsp;Post&nbsp;<&nbsp;ActiveRecord::Base &nbsp;&nbsp;has_many&nbsp;:comments &nbsp;&nbsp;amoeba&nbsp;do &nbsp;&nbsp;&nbsp;&nbsp;enable&nbsp;&nbsp;endendclass&nbsp;Comment&nbsp;<&nbsp;ActiveRecord::Base &nbsp;&nbsp;belongs_to&nbsp;:post &nbsp;&nbsp;has_many&nbsp;:ratings &nbsp;&nbsp;amoeba&nbsp;do &nbsp;&nbsp;&nbsp;&nbsp;enable&nbsp;&nbsp;endendclass&nbsp;Rating&nbsp;<&nbsp;ActiveRecord::Base &nbsp;&nbsp;belongs_to&nbsp;:commentend配置DSL有更多选项,因此请务必查看文档。请享用!:)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Ruby