Создание ассоциации до сохранения записи
Итак, я, по общему признанию, новичок 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