2011-08-23 16 views

Respuesta

10

Usted puede hacer algunas cosas para comprobar ...

En primer lugar, se puede comprobar un atributo individual como tal:

user = User.find(1) 
user.name_changed? # => false 
user.name = "Bob" 
user.name_changed? # => true 

embargo, también se puede comprobar que atribuye haber cambiado en todo el modelo:

user = User.find(1) 
user.changed  # => [] 
user.name = "Bob" 
user.age = 42 
user.changed  # => ['name', 'age'] 

Hay unas cuantas cosas que puede hacer demasiado - echa un vistazo http://api.rubyonrails.org/classes/ActiveModel/Dirty.html para más detalles.

Editar:

Pero, dado que esto está ocurriendo en una devolución de llamada after_commit, el modelo ya se ha guardado, es decir, el conocimiento de los cambios que se produjeron antes de que el guardar se pierden. Puede intentar usar la devolución de llamada before_save para elegir los cambios, almacénelos en algún lugar y acceda a ellos nuevamente al usar after_commit.

+0

¿Pero esto after_commit trabajo, o solamente antes de guardar? – AnApprentice

+3

Bien, perdón, me perdí esa parte. Después de guardar el modelo, los atributos cambiados se eliminan, por lo que sería bastante inútil ... ¿Podría usted mismo almacenar los atributos modificados usando 'before_save', por ejemplo, y luego recuperarlos después? – BaronVonBraun

+6

'changed?'/'Changes' funcionará en ** after_save **, pero no ** after_commit **. En cambio, puede usar 'previous_changes' en ** after_commit ** - vea @ Jonathan's [respuesta] (http://stackoverflow.com/a/16823712/165673) – Yarin

19

Puede usar previous_changes en after_commit para acceder a los valores de atributo de un modelo antes de guardarlo.

ver este post para más información: after_commit for an attribute

+1

activerecord es genial, acabo de tener un ejemplo de previous_changes - http://t.co/yjCLEdDHYH –

+0

Esta es la respuesta correcta. – typeoneerror

Cuestiones relacionadas