validator validations validates rails example callbacks before_update after_create after ruby-on-rails callback

ruby-on-rails - validations - validates activerecord



Ejecutar una devoluciĆ³n de llamada solo si un atributo ha cambiado en Rails (3)

Tengo la siguiente asociación en mi aplicación:

# Page belongs_to :status

Quiero ejecutar una devolución de llamada en cualquier momento que el status_id de una page haya cambiado.

Entonces, si page.status_id va de 4 a 5, quiero poder atrapar eso.

¿Cómo hacerlo?


Rieles 5.1+

class Page < ActiveRecord::Base before_save :do_something, if: :will_save_change_to_status_id? private def do_something # ... end end

La confirmación que cambió ActiveRecord :: Dirty está aquí: https://github.com/rails/rails/commit/16ae3db5a5c6a08383b974ae6c96faac5b4a3c81

Aquí hay una publicación de blog sobre estos cambios: https://www.ombulabs.com/blog/rails/upgrades/active-record-5-1-api-changes.html

Carriles <5.0

class Page < ActiveRecord::Base before_save :do_something, if: :status_id_changed? private def do_something # ... end end

Esto utiliza el hecho de que la before_save llamada before_save puede ejecutarse condicionalmente en función del valor de retorno de una llamada de método. El status_id_changed? el método proviene de ActiveModel::Dirty , que nos permite verificar si un atributo específico ha cambiado simplemente al _changed? al nombre del atributo.

Cuando se debe do_something método do_something depende de sus necesidades. Podría ser before_save o after_save o cualquiera de los ActiveRecord :: Callbacks definidos .