Для вновь созданных объектов, я бы рекомендовал использовать has_many
вспомогательные методы ассоциации build
или create
:
foo = Foo.create
bar1 = foo.bars.create # saves the record
bar2 = foo.bars.build # does not save the record
bar2.save! # actually creates the object
Эти помощники могут принимать хэш атрибутов, как обычные create
и new
- единственное отличие состоит в том, что они автоматически устанавливают связь для вас.
Если объект Bar, который вы пытаетесь добавить к foo
, уже существует, я бы предпочел установить связь в объекте bar:
foo = Foo.create # alternately Foo.find(1)
bar = Bar.find(1) # alternately Bar.new, but then use Foo.bars.build
bar.foo = foo
bar.save!
Таким образом, намного легче отследить проблемы, например, Вы можете легко справиться с ошибкой проверки. Единственное отличие от <<
в том, что он обновляет foo.bars
без перезагрузки, поэтому, если вам нужно, чтобы foo.bars
был немедленно обновлен с полным списком баров (старые и новые связанные бары), возможно, захотите использовать <<
.
В качестве заключительной сноски вы также можете использовать помощники build
, чтобы создать все сразу:
foo = Foo.new
bar1 = Foo.bars.build
bar2 = Foo.bars.build
foo.save! # saves foo, bar1, and bar2 in one transaction,
# provided they are all valid