Si può fare un paio di cose da controllare ...
In primo luogo, è possibile controllare un singolo attributo in quanto tale:
user = User.find(1)
user.name_changed? # => false
user.name = "Bob"
user.name_changed? # => true
Ma, è anche possibile controllare quali attributi sono cambiati in l'intero modello:
user = User.find(1)
user.changed # => []
user.name = "Bob"
user.age = 42
user.changed # => ['name', 'age']
ci sono alcune altre cose che potete fare troppo - check out http://api.rubyonrails.org/classes/ActiveModel/Dirty.html per i dettagli.
Edit:
Ma, dato che questo sta accadendo in un after_commit
richiamata, il modello è già stato salvato, cioè la conoscenza dei cambiamenti che si sono verificati prima del salvataggio sono persi. Puoi provare a utilizzare la funzione di richiamata before_save
per selezionare personalmente le modifiche, memorizzarle da qualche parte, quindi accedervi di nuovo quando si utilizza after_commit
.
Ma questo after_commit lavoro, o solo prima salvare? – AnApprentice
Giusto, mi dispiace, ho perso quella parte. Dopo aver salvato il modello, gli attributi modificati vengono cancellati, quindi sarebbe abbastanza inutile ... Potresti memorizzare gli attributi modificati usando 'before_save', ad esempio, e recuperarli successivamente? – BaronVonBraun
'cambiato?'/'Changes' funzionerà in ** after_save **, ma non ** after_commit **. Invece, puoi usare 'previous_changes' in ** after_commit ** - vedi @ Jonathan's [answer] (http://stackoverflow.com/a/16823712/165673) – Yarin