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
, Я надеюсь, что вы понимаете это уточнение.