2012-04-10 6 views
11

Rails初心者ですが、私はかなり一般的な問題であるに違いないが、ここで答えを見つけることはできません。 Fooのbelongs_toのレコードが保存される前にアソシエーションを作成する

class Foo < ActiveRecord::Base 
    has_many :bars 
end 

バー、動作するすべて:

は、私はこのようなモデルFooを持っています。今私はFooを作成し、同時にBarを作成したいと思います。このように:

f = Foo.new(:baz => 'baz') 
bars.each do |b| 
    f.bars.build(:bizzy => b[:bizzy]) 
end 
f.save 

親レコードが存在しないため、この関連付けは存在しないため、これを行う方法が必要です。

f = Foo.new(:baz => 'baz') 
f.save 
f = Foo.find(:first, :conditions => {:baz => 'baz'}) 
bars.each do |b| 
    f.bars.create(:bizzy => b[:bizzy]) 
end 

しかし、これはきれいではなく、すべて不快感を帯びています。

これを行う正しい方法は何ですか?

答えて

10

最初の行では、newの代わりにcreateを使用できます。 barオブジェクトが既に存在するため、f.bars.createまたはf.bars.buildは必要ありません。

f = Foo.create(:baz => 'baz') 

bars.each do |b| 
    f.bars << b 
end 

個人的に私はbarsを反復しませんが、ちょうどupdate_allを使用します:

f = Foo.create(:baz => 'baz') 
bars.update_all(:foo_id => f.id) 

は編集:それは最初のレコードを保存せずにこれを行うことが可能です私はこれを行うだろう。これは私のために働きます:

f = Foo.new(:baz => 'baz') 

bars.each do |b| 
    f.bars << b 
end 

f.save 
+0

こんにちは、私はできなかったことを誓いました。あなたは正しいですが、私は再びそれをテストした後、それは魅力のように働いた。ありがとう! – Eugene

+1

同じ問題に遭遇し、最後のオプション(f = Foo.new)でBarモデル(自分のコード内)で ':foo_id、remove:presence => true'を削除しなければならないことに気付きました。 – migu

関連する問題