2011-08-23 10 views

risposta

10

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.

+0

Ma questo after_commit lavoro, o solo prima salvare? – AnApprentice

+3

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

+6

'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

19

È possibile utilizzare previous_changes in after_commit per accedere ai valori di attributo di un modello prima che fosse salvato.

vedere questo post per ulteriori informazioni: after_commit for an attribute

+1

activerecord è bello, ho appena avuto un esempio di previous_changes - http://t.co/yjCLEdDHYH –

+0

Questa è la risposta corretta. – typeoneerror

Problemi correlati