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

96

existe-t-il un moyen d'obtenir la valeur d'origine qu'un attribut ActiveRecord (= la valeur 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.

Léonid Chevtsov
la source

Réponses:

243

Avant les rails 5.1

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

Pour rails 5.1+

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


L'ajout _wasest obsolète dans les 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 _waset _before_last_saveselon la documentation:

_ était la source 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
Vincent
la source
7
Par exemple: pour self.context:self.context_was
Freedom_Ben
2
Où est la documentation pour cela?
j le
4
la documentation peut être trouvée sur apidock.com/rails/ActiveModel/Dirty/attribute_was
hexinpeter
Dans la documentation, il n'y a pas d'avertissement de «désapprobation» pour _was.
Rael Gugelmin Cunha
11

Pour rails 5.1+

L'ajout _wasest obsolète dans les 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 _waset _before_last_saveselon la documentation:

_ était la source 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

Lucas Andrade
la source
1
attribute_wasa été déconseillée au profit de attribute_in_database, alors que attribute_before_last_savec'est une méthode complètement nouvelle à partir de la version 5.1 qui n'a pas d'équivalent dans les versions antérieures de Rails. Source: github.com/rails/rails/pull/25337#issuecomment-225166796
ohaleck