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
.
¿Pero esto after_commit trabajo, o solamente antes de guardar? – AnApprentice
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
'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