Rails 3 has_many изменился? - PullRequest
       31

Rails 3 has_many изменился?

10 голосов
/ 21 февраля 2012

Мне нужно отслеживать изменения (добавления и удаления) ассоциации, настроенной так:

has_many :listing_services
has_many :services, through: :listing_services

Для обычных атрибутов самый простой способ сделать это - проверить l.changes[attribute] в before_save или l.previous_changes[attribute] в after_save.

Вопрос в том, как лучше всего это сделать для has_many атрибутов?

1 Ответ

16 голосов
/ 21 февраля 2012

Я не использовал changes метод. Но я уверен, что вы всегда можете использовать магические методы <attribute_name>_changed? и <attribute_name>_was:

services.any? {|s| s.attribute_name_changed?}
services.map(&:attribute_name_was)

См. Railscast Райана Бейтса для получения дополнительной информации: # 109 эпизод

ОБНОВЛЕНИЕ : Вы можете передать :after_delete и :after_add обратные вызовы в has_many связь напрямую:

has_many :items, :after_add => :my_method_or_proc1, :after_remove => :my_method_or_proc2

Будьте осторожны при использовании этих обратных вызовов и обратите внимание, как они работают. Они Вызываются items.build и items.create один раз . Так что если вы позвоните items.build, а затем сохранить родительский объект (с вложенными атрибутами для пример) after_add callback будет вызываться только один раз при сборке связанный объект . Это означает, что если родитель имеет проверку, то встроенный items не будет сохранен в базе данных, и вы не сможете положиться на обратный вызов after_add. Другими словами, это не говорит о том, что добавленная запись ассоциации была сохранена в БД. Таким образом, вы гарантируете, что элемент добавляется и сохраняется только по вызову items.create. Я надеюсь, вы понимаете это разъяснение.

...