ruby-on-rails – 在rails中克隆记录,可以克隆关联和深层复制吗?

我在.clone – 在铁轨记录

  new_blerg = Blerg.find(1).clone

该记录具有负载和负载的关联,并且这些关联甚至具有关联。

有没有办法深入复制一个记录并克隆它,以便与所有这些关联克隆?

最佳答案
您可以从ActiveRecord 3.2的Amoeba gem中获得一些很好的用途。

它支持has_one,has_many和has_and_belongs_to_many关联,字段预处理以及高度灵活和强大的配置DSL的轻松自动递归重复,可以同时应用于模型和即​​时。

一定要看看Amoeba Documentation,但用法很容易…

只是

gem install amoeba

或添加

gem 'amoeba'

到你的宝石档案

然后将amoeba块添加到您的模型,并像往常一样运行dup方法

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

  amoeba do
    enable
  end
end

class Comment < ActiveRecord::Base
  belongs_to :post
end

class Tag < ActiveRecord::Base
  has_and_belongs_to_many :posts
end

class PostsController < ActionController
  def some_method
    my_post = Post.find(params[:id])
    new_post = my_post.dup
    new_post.save
  end
end

您的新帖子应该具有最初与之关联的所有标签,并且所有评论也应该重复。您可以通过DSL禁用各种记录的复制,您可以在文档中阅读,但例如,如果您想保留标签,但不能评论您可以这样做:

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

  amoeba do
    include_field :comments
  end
end

或使用排他性语法

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

  amoeba do
    exclude_field :comments
  end
end

或通过指定哪些字段类型进行识别(并因此复制)

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

  amoeba do
    recognize :has_and_belongs_to_many
  end
end

这些各种选项中的每一个应该导致将新帖子与旧帖子相同的标签重新关联,但不会复制评论。

如果启用它们,变形虫也会自动递归到子记录中

class Post < ActiveRecord::Base
  has_many :comments

  amoeba do
    enable
  end
end

class Comment < ActiveRecord::Base
  belongs_to :post
  has_many :ratings

  amoeba do
    enable
  end
end

class Rating < ActiveRecord::Base
  belongs_to :comment
end

您还可以使用一些额外的数据前缀字段来表示唯一性

class Post < ActiveRecord::Base
  has_many :comments

  amoeba do
    enable
    prepend :title => "Copy of "
  end
end

并且除了前缀之外,您还可以在给定字段上追加或运行正则表达式

请享用! 🙂

转载注明原文:ruby-on-rails – 在rails中克隆记录,可以克隆关联和深层复制吗? - 代码日志