Создание ассоциации до сохранения записи

Итак, я, по общему признанию, новичок Rails, и я сталкиваюсь с тем, что должно быть довольно распространенной проблемой, но я не могу найти ответ здесь.

У меня есть модель Foo, как это:

class Foo < ActiveRecord::Base
  has_many :bars
end

Бары принадлежат_Foo, все это работает. Теперь я хочу создать панель Foo и build одновременно. Вот так:

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

Но это не чисто, и все вокруг неприятно.

Каков правильный способ сделать это?

Ответ 1

В первой строке вы можете просто использовать create вместо new. Вам не нужны f.bars.create или f.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