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

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

has_many :listing_services
has_many :services, through: :listing_services

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

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

1 ответ

Решение

Я не пользовалась 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 обратный вызов будет вызываться только один раз при построении связанного объекта. Это означает, что если родитель имеет проверку, то построен items не будут сохранены в базе данных, и вы не можете полагаться на after_add Перезвоните. Другими словами, это не говорит о том, что добавленная запись ассоциации была сохранена в БД. Таким образом, вы гарантируете, что товар добавлен и сохранен только по вызову items.create, Я надеюсь, что вы понимаете это уточнение.

Другие вопросы по тегам