如何克隆has_many关联

时间:2012-06-25 15:40:06

标签: ruby clone

class Bar < ActiveRecord::Base
  belongs_to :foo
end

class Foo < ActiveRecord::Base
  has_many :bars
end

Foo oldFoo = Foo.new

Foo foo = Foo.new
foo.bars << oldFoo.bars.all.collect { |bar| bar.clone }

上面的命令没有正确替换bars.foo_id,oldFoo.bars的引用被删除并被设置为foo.bars。

我该如何正确地做到这一点?

1 个答案:

答案 0 :(得分:0)

foo.bars << oldFoo.bars.all.collect { |bar| Bar.new(bar.attributes) }

受保护的属性赋值会在R3.2中引发错误。

更新:

看起来和clone是一样的,所以它并没有好多少。如果您定义类似的方法(我经常使用它们):

class Hash
 def select_at(*s_keys)
    Hash[s_keys.zip(values_at(*s_keys))]
  end

  def reject_at(*r_keys)
    select_at(keys - r_keys)
  end
end

你可以写Bar.new(bar.attributes.reject_at("id", "foo_id"))