2011-07-18 20 views
29

W mojej aplikacji rozmowa ma wiele komunikatów. Jak zaktualizować atrybut updated_at Konwersacji, gdy nowa wiadomość w tej rozmowie zostanie utworzona/zapisana?Szyny: Zaktualizuj obiekt nadrzędny podczas zapisywania dziecka

Jestem świadomy :touch => true, która to robi, ale aktualizuje również wątek, gdy wiadomość jest zniszczona, co nie jest tym, czego chcę.

Dzięki.

modele

class Conversation < ActiveRecord::Base 
    has_many :messages 
end 

class Message < ActiveRecord::Base 
    belongs_to :conversation 
end 

Odpowiedz

36

użycie zwrotna wewnątrz klasy Wiadomość

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

+1 za pobicie mnie do ponczu! – jaydel

+0

świetnie, dzięki za to. – alste

+0

czy możesz mi powiedzieć, dlaczego działa, nawet nie wspominając o "self.conversation ...". kiedy i kiedy nie używać "siebie"? – HungryCoder

51

Yo możesz też zdefiniować to również w związku.

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

(Źródło samo jak William G odpowiedź: http://apidock.com/rails/ActiveRecord/Persistence/touch)

+8

To nie działa oddzwanianie !! a większość czasu, w którym chcesz to zrobić, to wtedy, gdy chcesz uruchomić nadrzędne wywołania zwrotne. – Nerve

+3

Z oryginalnego pytania: 'Jak zaktualizować atrybut updated_at konwersacji, kiedy nowa wiadomość w tej konwersacji zostanie utworzona/zapisana?' Metoda '.touch' jest używana głównie do aktualizacji znaczników czasowych. (Z dokumentacji: 'Zapisuje rekord z ustawionymi atrybutami updated_at/on na bieżący czas.) Najczęstszym użyciem' touch' jest prawdopodobnie wygaśnięcie pamięci podręcznej. Jeśli chcesz wywołania zwrotne, istnieje wywołanie zwrotne 'after_touch'. – chug2k

+0

Kolejne zastosowanie dotyczy znaczników czasu na mapie witryny, w takim przypadku nie jest wymagane żadne oddzwanianie. – Swards

Powiązane problemy