2011-07-18 22 views
29

En mi aplicación, una conversación tiene muchos mensajes. ¿Cómo actualizo el atributo updated_at de una conversación cuando se crea/guarda un nuevo mensaje en esa conversación?Rieles: actualice el objeto principal al guardar el elemento secundario

Conozco :touch => true, que hace esto, pero también actualiza la conversación cuando se destruye un mensaje, que no es lo que quiero.

Gracias.

Modelos

class Conversation < ActiveRecord::Base 
    has_many :messages 
end 

class Message < ActiveRecord::Base 
    belongs_to :conversation 
end 

Respuesta

36

utilización de devolución de llamada dentro de la clase Mensaje

after_save do 
    conversation.update_attribute(:updated_at, Time.now) 
end 
+0

+1 para mí vencer por la mano! – jaydel

+0

genial, gracias por eso. – alste

+0

puede decirme por qué funciona, incluso sin mencionar 'self.conversation ...'. cuándo y cuándo no usar 'self'? – HungryCoder

51

Yo también puedes definirlo en la relación.

class Message < ActiveRecord::Base 
    belongs_to :conversation, touch: true 
end 

(Fuente misma que la respuesta de William G: http://apidock.com/rails/ActiveRecord/Persistence/touch)

+8

¡Esto no ejecuta retrollamadas !! y la mayoría de las veces que desea hacer esto es cuando desea ejecutar devoluciones de llamadas para padres. – Nerve

+3

De la pregunta original: '¿Cómo actualizo el atributo updated_at de una conversación cuando se crea/guarda un nuevo mensaje en esa conversación?' El método '.touch' se usa principalmente para actualizar marcas de tiempo. (De la documentación: 'Guarda el registro con los atributos updated_at/on establecidos en la hora actual.) El uso más común de' touch' es probablemente el vencimiento de la caché. Si quiere devoluciones de llamada, hay una devolución de llamada 'after_touch'. – chug2k

+0

Otro uso es para las marcas de tiempo del mapa del sitio, no se requieren devoluciones de llamada en ese caso. – Swards

Cuestiones relacionadas