Ruby on Rails: создание дочернего элемента со значениями по умолчанию при создании его родительского элемента - PullRequest
10 голосов
/ 17 августа 2010

У меня есть родительские и дочерние модели отношений. В дочернем файлеigration.rb каждый из столбцов дочерней модели имеет значения по умолчанию (кроме столбца parent_id).

Когда я создаю новый родительский объект, как я могу сделать так, чтобы дочерний объект был создан и сохранен в его таблице с данными из значений по умолчанию вместе с parent_id?

Я думаю, что это будет связано с чем-то вроде after_create на родительской модели, но я не уверен, как его настроить.

Ответы [ 2 ]

13 голосов
/ 17 августа 2010

Исправлено: я исправил ответ, чтобы использовать 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

Добавлено ...

Метод сборки добавляется механизмом модели-владельца оператором has_many.Поскольку в примере используется has_many: doors (имя модели Door), вызовом сборки является doors.build

. См. Документы для 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 появилась опция автосохранения для ассоциаций.Я не думаю, что это относится к вышесказанному (я использую по умолчанию). Результаты тестирования автосохранения.

1 голос
/ 17 августа 2010

Вы не указали (или я перечитал это), какие отношения вы используете.Если вы используете отношение один к одному, например has_one, create не будет работать.В этом случае вы должны использовать что-то вроде этого:

в parent.rb

has_one :child
before_create  {|parent| parent.build_child(self)}

after_create может также работать, не проверяя это.

в то время как в дочернем.rb

belongs_to :parent

Я довольно долго боролся с этим, когда настраивал модель пользователя в моем текущем приложении.

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html Вы можете видеть, что has_one не поддерживает parent.build или parent.create

Надеюсь, это поможет.Я новичок в Ruby и медленно начинаю пробираться через джунгли Ruby.Хорошее путешествие, но в нем легко заблудиться.:)

...