在保存记录之前创建关联

Eug*_*ene 11 ruby activerecord ruby-on-rails-3

所以,我当然是一个Rails新手,我正在遇到一个相当普遍的问题,但我找不到答案.

我有这样的模型Foo:

class Foo < ActiveRecord::Base
  has_many :bars
end
Run Code Online (Sandbox Code Playgroud)

酒吧belongs_to Foo,一切正常.现在我想创建一个Foo并同时构建Bar.像这样:

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

我知道这不起作用,因为父记录不存在,所以关联不存在,但必须有一种方法来做到这一点.我暂时通过编辑来解决这个问题:

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
Run Code Online (Sandbox Code Playgroud)

但这并不干净,而且一切都令人不快.

这样做的正确方法是什么?

Mis*_*cha 10

在第一行中,您可以使用create而不是new.您不需要f.bars.createf.bars.build,因为该bar对象已存在.我会这样做:

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

bars.each do |b|
  f.bars << b
end
Run Code Online (Sandbox Code Playgroud)

我个人不会迭代bars,但只是使用update_all:

f = Foo.create(:baz => 'baz')
bars.update_all(:foo_id => f.id)
Run Code Online (Sandbox Code Playgroud)

编辑:可以在不保存记录的情况下执行此操作.这对我有用:

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

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

f.save
Run Code Online (Sandbox Code Playgroud)