0
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 }

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

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

4

1 回答 1

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"))

于 2012-06-25T17:00:10.687 回答