2012-04-10 96 views
11

所以,我承認Rails新手,我遇到了一個相當普遍的問題,但我在這裏找不到答案。在記錄保存之前創建關聯

我有這樣一個模型Foo

class Foo < ActiveRecord::Base 
    has_many :bars 
end 

酒吧belongs_to的富,所有的作品。現在我想創建一個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

在第一行中,您可以使用create而不是new。您不需要f.bars.createf.bars.build,因爲bar對象已經存在。我這樣做:

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 2012-04-10 13:58:21

+1

出現同樣的問題,並意識到對於最後一個選項(f = Foo.new),我必須在Bar模型(在我自己的代碼中)刪除':foo_id,remove:presence => true'。 – migu 2013-12-06 09:18:02

相關問題