Почему ActiveRecord только иногда автоматически предоставляет взаимные ассоциации? - PullRequest
1 голос
/ 16 августа 2010

При работе с activerecord я замечаю, что при построении связей обратная связь предоставляется автоматически, только если обратная модель уже была сохранена.Если он еще не был сохранен, это взаимное сопоставление должно быть определено вручную.Мне интересно, является ли это преднамеренным или ошибочным, поскольку единственное различие в том, что он работает или не работает, заключается в том, была ли сохранена взаимная модель или нет..

http://gist.github.com/527046

Я ожидаю, что сценарий 1 будет работать без дополнительного шага назначения, показанного в сценарии 3. Это не так.

1 Ответ

3 голосов
/ 16 августа 2010

Причина довольно проста - когда вы создаете объект с помощью ассоциации, в которой родительский объект еще не сохранен, связанный с ним внешний ключ не может иметь значение, поскольку связанная запись еще не сохранена.Примером:

# Registration announcement is not saved at this point, so it has no ID.
@a1 = @e1.build_registration_announcement(:announcement => "Please bring a favorite baked dish.")
# Registration is built without a registration_announcement_id, as @a1 has no ID to pass on.
@a1.registrations.build(:contact_email => "jdoe@yahoo.com", :adults => 1)
#registration doesn't know about its unsaved registration_announcement parent

# Registration announcement is created and saved. ID exists.
@a2 = @e2.create_registration_announcement(:announcement => "Fall house cleaning!")
# Since the Registration announcement has an ID, registration_announcement_id is set on the built associated registration
@a2.registrations.build(:contact_email => "tara.smith@yahoo.com", :adults => 5)
#registration knows about its saved registration_announcement parent

Это немного неожиданно, поскольку вы можете логически ожидать, что Rails будет поддерживать ассоциацию объекта, а затем назначать внешний ключ ассоциации во время сохранения, но, похоже, это не так.работать так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...