为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

智慧大石 2019-09-19 08:47:08
我想制作一个activerecord记录的副本,更改进程中的单个字段(除了id)。实现这一目标的最简单方法是什么?我意识到我可以创建一个新记录,然后遍历每个字段逐个复制数据 - 但我认为必须有一个更简单的方法来做到这一点......如: @newrecord=Record.copy(:id)  *perhaps?*
查看完整描述

3 回答

?
达令说

TA贡献1821条经验 获得超6个赞

要获取副本,请使用克隆(或dup for rails 3.1)方法:

# rails < 3.1new_record = old_record.clone#rails >= 3.1new_record = old_record.dup

然后你可以改变你想要的任何字段。

ActiveRecord会覆盖内置的Object#clone,为您提供一个带有未分配ID的新记录(未保存到数据库)。
请注意,它不会复制关联,因此如果需要,您必须手动执行此操作。

Rails 3.1 clone是一个浅拷贝,使用dup代替...


查看完整回答
反对 回复 2019-09-19
?
神不在的星期二

TA贡献1963条经验 获得超6个赞

您可能也喜欢ActiveRecord 3.2 的Amoeba宝石

在你的情况,你可能想使用的nullifyregexprefix在配置DSL可用的选项。

它支持的简单和自动递归重复has_onehas_manyhas_and_belongs_to_many协会,现场预处理和既能对模型和动态应用了灵活而强大的配置DSL。

请务必查看Amoeba文档,但使用非常简单......

只是

gem install amoeba

或添加

gem 'amoeba'

到你的Gemfile

然后将变形虫块添加到模型中并dup像往常一样运行方法

class Post < ActiveRecord::Base
  has_many :comments
  has_and_belongs_to_many :tags

  amoeba do
    enable  endendclass Comment < ActiveRecord::Base
  belongs_to :postendclass Tag < ActiveRecord::Base
  has_and_belongs_to_many :postsendclass PostsController < ActionController
  def some_method
    my_post = Post.find(params[:id])
    new_post = my_post.dup
    new_post.save  endend

您还可以控制以多种方式复制哪些字段,但是,例如,如果您希望防止注释被复制但是您想要维护相同的标记,则可以执行以下操作:

class Post < ActiveRecord::Base
  has_many :comments
  has_and_belongs_to_many :tags

  amoeba do
    exclude_field :comments  endend

您还可以预处理字段,以帮助指示前缀和后缀以及正则表达式的唯一性。此外,还有许多选项,因此您可以为您的目的以最易读的方式编写:

class Post < ActiveRecord::Base
  has_many :comments
  has_and_belongs_to_many :tags

  amoeba do
    include_field :tags
    prepend :title => "Copy of "
    append :contents => " (copied version)"
    regex :contents => {:replace => /dog/, :with => "cat"}
  endend

关联的递归复制很容易,也可以在子模型上启用变形虫

class Post < ActiveRecord::Base
  has_many :comments

  amoeba do
    enable  endendclass Comment < ActiveRecord::Base
  belongs_to :post
  has_many :ratings

  amoeba do
    enable  endendclass Rating < ActiveRecord::Base
  belongs_to :commentend

配置DSL有更多选项,因此请务必查看文档。

请享用!:)


查看完整回答
反对 回复 2019-09-19
  • 3 回答
  • 0 关注
  • 574 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信