У меня есть родитель и дочерняя модель отношений. В дочернем файлеigration.rb каждый из столбцов дочерней модели имеет значения по умолчанию (кроме столбца parent_id).
Когда я создаю новый родительский объект, как я могу сделать так, чтобы дочерний объект был создан и сохранен в его таблице? с данными из значений по умолчанию вместе с parent_id?
Я думаю, что это будет связано с чем-то вроде after_create
в родительской модели, но я не уверен, как установить это до.
Revised: Я изменил ответ, чтобы использовать before_create и строить, а не создавать связанные модели. Затем механизм ActiveRecord позаботится о сохранении связанных моделей после сохранения родителя.
Я даже протестировал этот код!
# in your Room model...
has_many :doors
before_create :build_main_door
private
def build_main_door
# Build main door instance. Will use default params. One param (:main) is
# set explicitly. The foreign key to the owning Room model is set
doors.build(:main => true)
true # Always return true in callbacks as the normal 'continue' state
end
####### has_one case:
# in your Room model...
has_one :door
before_create :build_main_door
private
def build_main_door
# Build main door instance. Will use default params. One param (:main) is
# set explicitly. The foreign key to the owning Room model is set
build_door(:main => true)
true # Always return true in callbacks as the normal 'continue' state
end
Добавлено...
Метод build добавляется механизмом модели-владельца с помощью оператора has_many. Поскольку в примере используется has_many :doors (имя модели Door), вызов build будет doors.build
Смотрите docs для has_many и has_one, чтобы увидеть все дополнительные методы, которые добавляются.
# If the owning model has
has_many :user_infos # note: use plural form
# then use
user_infos.build(...) # note: use plural form
# If the owning model has
has_one :user_info # note: use singular form
# then use
build_user_info(...) # note: different form of build is added by has_one since
# has_one refers to a single object, not to an
# array-like object (eg user_infos) that can be
# augmented with a build method
В Rails 2.x появилась опция автосохранения для ассоциаций. Я не думаю, что она применима к приведенным выше (я использую значение по умолчанию). Результаты тестирования автосохранения.
Вы не указали (или я перечитал), какие отношения вы используете. Если вы используете отношения «один-к-одному», такие как «has_one», создание не сработает. В этом случае вы должны использовать что-то вроде этого:
в parent.rb
has_one :child
before_create {|parent| parent.build_child(self)}
after_create также может работать, мы это не тестировали.
, в то время как в child.rb
belongs_to :parent
я немного боролся с этим при настройке пользовательской модели в моем текущем приложении.
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html Вы можете видеть, что has_one не поддерживает parent.build или parent.create
Надеюсь, это поможет. Я новичок в Руби и медленно начинаю пробираться через рубиновые джунгли. Хорошее путешествие, но в котором легко заблудиться. :)