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 }

上記のコマンドはbars.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 に答える