So erhalten Sie den ursprünglichen Wert eines Attributs in Rails

96

Gibt es eine Möglichkeit, den ursprünglichen Wert eines ActiveRecord-Attributs abzurufen (= den Wert, der aus der Datenbank geladen wurde)?

Ich möchte so etwas in einem Beobachter

before_save object
  do_something_with object.original_name
end

Die Aufgabe besteht darin, das Objekt beim Aktualisieren aus einer Hash-Tabelle zu entfernen (tatsächlich in einen anderen Schlüssel in der Tabelle zu verschieben).

Leonid Shevtsov
quelle

Antworten:

243

Vor Schienen 5.1

Wenn Sie _wasan Ihr Attribut anhängen, erhalten Sie den vorherigen Wert.

Für Schienen 5.1+

Von der Antwort von Lucas Andrade unten kopiert : https://stackoverflow.com/a/50973808/9359123


Das _wasAnhängen ist in Rails 5.1 veraltet. Jetzt sollten Sie es anhängen_before_last_save

Etwas wie:

before_save object
  do_something_with object.name_before_last_save
end

Gibt den Namenswert vor dem letzten Speichern in der Datenbank zurück (funktioniert zum Speichern und Erstellen).


Der Unterschied zwischen _wasund _before_last_savegemäß der Dokumentation:

_was Quelle aus Dokumenten

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

_before_last_save Quelle aus Dokumenten

def attribute_before_last_save(attr_name)
  mutations_before_last_save.original_value(attr_name)
end
Vincent
quelle
7
ZB: für self.context:self.context_was
Freedom_Ben
2
Wo ist die Dokumentation dazu?
J wird
4
Die Dokumentation finden Sie unter apidock.com/rails/ActiveModel/Dirty/attribute_was
hexinpeter
In der Dokumentation gibt es keine Warnung "Verfall" für _was.
Rael Gugelmin Cunha
11

Für Schienen 5.1+

Das _wasAnhängen ist in Rails 5.1 veraltet. Jetzt sollten Sie es anhängen_before_last_save

Etwas wie:

before_save object
  do_something_with object.name_before_last_save
end

Gibt den Namenswert vor dem letzten Speichern in der Datenbank zurück (funktioniert zum Speichern und Erstellen).


Der Unterschied zwischen _wasund _before_last_savegemäß der Dokumentation:

_was Quelle aus Dokumenten

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

_before_last_save Quelle aus Dokumenten

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

Sie können hier ein besseres Beispiel sehen

Lucas Andrade
quelle
1
attribute_waswurde zugunsten von abgelehnt attribute_in_database, während attribute_before_last_savees sich ab 5.1 um eine völlig neue Methode handelt, die in früheren Versionen von Rails keine Entsprechung hat. Quelle: github.com/rails/rails/pull/25337#issuecomment-225166796
ohaleck
8

Die ActiveRecord- attributes_before_type_castMethode gibt einen Hash von Attributen zurück, bevor Typumwandlung und Deserialisierung stattgefunden haben.

John Topley
quelle