2012-04-10 63 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

相关问题