ActiveRecord:我可以复制关联吗?

Pau*_*aul 17 ruby activerecord ruby-on-rails

有没有办法将一个模型的关联复制到另一个模型......

template_model = MyModel.find(id)
new_model = template_model.clone
new_model.children << template_model.children # I want to *copy* children
Run Code Online (Sandbox Code Playgroud)

...这样我将孩子从模板复制到新模型?(实际上,此代码将子项从模板移动到新模型).

我知道我可以手动循环,但是有更简洁的方法吗?

谢谢

Mar*_*usQ 28

问题是你正在克隆模板,但没有克隆它的孩子.尝试类似的东西:

template_model = MyModel.find(id)
new_model = template_model.clone
new_model.children << template_model.children.collect { |child| child.clone }
Run Code Online (Sandbox Code Playgroud)


And*_*hyn 5

在 /lib 下添加一些。例如 clone_deep.rb。

module CloneDeep
  def clone_deep
    kopy = clone
    self.class.reflect_on_all_associations.each do |association|
      next if association.macro == :belongs_to
      cloned_object = case association.macro
                        when :has_many
                          self.send(association.name).collect { |item| item.clone_deep }
                        when :has_one
                          self.send(association.name) && self.send(association.name).clone_deep
                        else
                          clone
                      end
      kopy.send("#{association.name}=", cloned_object)
    end
    return kopy
  end
end
Run Code Online (Sandbox Code Playgroud)

在 config/initializers/ 文件夹下创建新的初始化程序。在这个文件里面粘贴

ActiveRecord::Base.send(:include, CloneDeep)
Run Code Online (Sandbox Code Playgroud)

现在您可以使用它的所有 has_one 和 hos_many 关联来克隆模型。

cloned_person = person.clone_deep
cloned_person.save
Run Code Online (Sandbox Code Playgroud)