web-dev-qa-db-fra.com

Comment obtenir la valeur d'origine d'un attribut dans Rails

existe-t-il un moyen d'obtenir la valeur d'origine d'un attribut ActiveRecord (= la valeur qui a été chargée à partir de la base de données)?

Je veux quelque chose comme ça chez un observateur

before_save object
  do_something_with object.original_name
end

La tâche consiste à supprimer l'objet d'une table de hachage (en fait, le déplacer vers une autre clé de la table) lors de la mise à jour.

95
Leonid Shevtsov

Ajout de _was à votre attribut vous donnera la valeur précédente.

239
Vincent

ActiveRecord's attributes_before_type_cast La méthode renvoie un hachage d'attributs avant que la transtypage et la désérialisation ne se produisent.

8
John Topley

Pour Rails 5.1+

Ajout de _was est déconseillé dans Rails 5.1, vous devez maintenant ajouter _before_last_save

Quelque chose comme:

before_save object
  do_something_with object.name_before_last_save
end

Renverra la valeur du nom avant votre dernière sauvegarde dans la base de données (fonctionne pour enregistrer et créer)


La différence entre _was et _before_last_save selon la documentation:

_ était source à partir de la documentation

def attribute_was(attr)
  attribute_changed?(attr) ? changed_attributes[attr] : __send__(attr)
end

_ before_last_save source à partir de la documentation

def attribute_before_last_save(attr_name)
  mutations_before_last_save.original_value(attr_name)
end

Vous pouvez voir un meilleur exemple ici

8
Lucas Andrade

Jetez un œil dans la documentation Rails

http://api.rubyonrails.org/classes/ActiveModel/Dirty.html

Model.attribute_was renvoie la valeur précédente: D

4
rderoldan1