99 votes

Comment obtenir la valeur originale d'un attribut dans Rails

Existe-t-il un moyen d'obtenir la valeur originale d'un attribut ActiveRecord (= la valeur qui a été chargée depuis la base de données) ?

Je veux quelque chose comme ça dans 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.

249voto

Vincent Points 1973

Avant les rails 5.1

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

Pour les rails 5.1 et plus

Copié de la réponse de Lucas Andrade ci-dessous : https://stackoverflow.com/a/50973808/9359123


Ajout de _was est déprécié dans rails 5.1, maintenant vous devez ajouter _before_last_save

Quelque chose comme :

before_save object
  do_something_with object.name_before_last_save
end

Retournera la valeur du nom avant votre dernière sauvegarde dans la base de données (fonctionne pour la sauvegarde et la création).

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

C'était source à partir de la documentation

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

_avant_dernière_save source à partir de la documentation

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

7 votes

Par exemple : pour self.context : self.context_was

2 votes

Où se trouve la documentation à ce sujet ?

4 votes

La documentation peut être trouvée à l'adresse suivante apidock.com/rails/ActiveModel/Dirty/attribute_was

13voto

Lucas Andrade Points 407

Pour les rails 5.1 et plus

Ajout de _was est déprécié dans rails 5.1, maintenant vous devez ajouter _before_last_save

Quelque chose comme :

before_save object
  do_something_with object.name_before_last_save
end

Retournera la valeur du nom avant votre dernière sauvegarde dans la base de données (fonctionne pour la sauvegarde et la création).

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

C'était source à partir de la documentation

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

_avant_dernière_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 aquí

8voto

John Topley Points 58789

Le programme ActiveRecord attributes_before_type_cast La méthode renvoie un hachage d'attributs avant que le typage et la désérialisation ne soient effectués.

6voto

rderoldan1 Points 761

Regardez dans la documentation de rails

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

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

0 votes

Était également toujours dans Rails 5.2.x

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X