Rails 5.1+
class Page < ActiveRecord::Base
before_save :do_something, if: :will_save_change_to_status_id?
private
def do_something
# ...
end
end
Le commit qui a changé ActiveRecord :: Dirty est ici: https://github.com/rails/rails/commit/16ae3db5a5c6a08383b974ae6c96faac5b4a3c81
Voici un article de blog sur ces changements: https://www.ombulabs.com/blog/rails/upgrades/active-record-5-1-api-changes.html
Voici le résumé que j'ai fait pour moi-même sur les modifications apportées à ActiveRecord :: Dirty in Rails 5.1+:
ActiveRecord :: Sale
https://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Dirty.html
Avant de sauvegarder (CHANGEMENT OPTIONNEL)
Après avoir modifié un objet et avant de l'enregistrer dans la base de données, ou dans le before_save
filtre:
changes
devrait maintenant être changes_to_save
changed?
devrait maintenant être has_changes_to_save?
changed
devrait maintenant être changed_attribute_names_to_save
<attribute>_change
devrait maintenant être <attribute>_change_to_be_saved
<attribute>_changed?
devrait maintenant être will_save_change_to_<attribute>?
<attribute>_was
devrait maintenant être <attribute>_in_database
Après l'enregistrement (BREAKING CHANGE)
Après la modification d' un objet et après la sauvegarde de la base de données, ou dans le after_save
filtre:
saved_changes
(remplace previous_changes
)
saved_changes?
saved_change_to_<attribute>
saved_change_to_<attribute>?
<attribute>_before_last_save
Rails <= 5,0
class Page < ActiveRecord::Base
before_save :do_something, if: :status_id_changed?
private
def do_something
# ...
end
end
Cela utilise le fait que le before_save
rappel peut s'exécuter conditionnellement en fonction de la valeur de retour d'un appel de méthode. La status_id_changed?
méthode vient d' ActiveModel :: Dirty , qui nous permet de vérifier si un attribut spécifique a changé en l'ajoutant simplement _changed?
au nom de l'attribut.
Le moment où la do_something
méthode doit être appelée dépend de vos besoins. Il peut s'agir de before_save
ou after_save
ou de l'un des ActiveRecord :: Callbacks définis .
Le
attribute_changed?
est obsolète dans Rails 5.1, il suffit maintenant de l'utiliserwill_save_change_to_attribute?
.Pour plus d'informations, consultez ce problème .
la source
Essaye ça
Référence - http://apidock.com/rails/ActiveRecord/Dirty
la source