2012-02-21 20 views
10

I necesidad de rastrear cambios (adiciones y eliminaciones) de una asociación configurar como esto:Rails 3 has_many changed?

has_many :listing_services 
has_many :services, through: :listing_services 

Para los atributos normales, la forma mas fácil de hacerlo es comprobar l.changes[attribute] en before_save o l.previous_changes[attribute] en after_save.

La pregunta es, ¿cuál es la mejor manera de hacerlo para los atributos has_many?

Respuesta

16

No usé el método changes. Pero estoy seguro de que siempre se puede utilizar métodos mágicos <attribute_name>_changed? y <attribute_name>_was:

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

Ver Ryan Bates para más información: #109 episode

ACTUALIZACIÓN: Puede pasar :after_delete y :after_add devoluciones de llamada a has_many asociación directa:

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

Sé coche eful utilizar estas devoluciones de llamada y prestar atención a cómo funcionan. Se llaman en items.build y items.createuna vez. Así que si usted llama items.build y luego guardar objeto padre (con atributos anidados para ejemplo) after_add devolución de llamada se llamará sólo una vez en la construcción de objeto asociado. Significa que si el padre tiene validación, entonces el items no se guardará en la base de datos y no puede confiar en la devolución de llamada after_add. En otras palabras, no dice que el registro de la asociación añadida se guardó en el DB. De modo que tiene garantía de que el artículo se agrega y guarda solo en la llamada items.create. Espero que entiendas esta aclaración.

+0

Para mí, esto solo funciona, si el objeto asociado se actualiza. NO funciona para mí, si el objeto asociado se agrega o elimina (ya que ya no está presente en la asociación 'services'). ¿Qué estoy haciendo mal? – morgler

Cuestiones relacionadas