Ich möchte eine Rückruffunktion in Schienen erstellen, die ausgeführt wird, nachdem ein Modell gespeichert wurde.
Ich habe dieses Modell, Anspruch, der ein Attribut 'Status' hat, das sich je nach Status des Anspruchs ändert. Mögliche Werte stehen noch aus, werden gebilligt, genehmigt, abgelehnt
Die Datenbank hat den Status "Status" mit dem Standardwert "Ausstehend".
Ich möchte bestimmte Aufgaben ausführen, nachdem das Modell beim ersten Mal erstellt oder von einem Status in einen anderen aktualisiert wurde, je nachdem, von welchem Status es sich ändert.
Meine Idee ist es, eine Funktion im Modell zu haben:
after_save :check_state
def check_state
# if status changed from nil to pending (created)
do this
# if status changed from pending to approved
performthistask
end
Meine Frage ist, wie ich vor der Änderung innerhalb des Modells nach dem vorherigen Wert suchen kann.
quelle
dirty
Aufrufe funktionieren inafter_save
(sowohl in Rails 2.3 als auch in 3.x). Ich habe es mehrmals benutzt.after_commit
Rückrufen, die in Rails 3.x eingeführt wurden , nicht verfügbar sind . Sie werden sicherlich in arbeitenafter_save
.after_save
handelt es sich um einen Rückruf für einen Zustand zwischenafter DML
undbefore_commit
. Sie können die gesamte Transaktion beenden,after_save
indem Sie eine Ausnahme auslösen. Wenn Sie nach dem Speichern etwas tun möchten, ohne die aktuelle Operation zu beeinträchtigen, verwenden Sieafter_commit
:-)Sie können dies verwenden
Es gibt ein Array aller Spalten zurück, die sich in diesem Datensatz geändert haben
Sie können auch verwenden
Dies gibt einen Hash von Spalten zurück, die sich geändert haben und vor und nach den Ergebnissen als Arrays
quelle
self.
diese zu verwenden - Sie können einfach sagenchanged
undchanges
.self
im Modell selbst weglassen , aber Sie können diese für jedes Objekt mitobject.changed
und aufrufenobject.changes
. :)Ich empfehle Ihnen, sich eines der verfügbaren Plugins für Zustandsmaschinen anzusehen:
In beiden Fällen können Sie Zustände und Übergänge zwischen Zuständen einrichten. Sehr nützliche und einfache Möglichkeit, Ihre Anforderungen zu erfüllen.
quelle
Für Rails 5.1+ sollten Sie die aktive Datensatzattributmethode verwenden: saved_change_to_attribute?
Ihr Modell sieht also so aus, wenn Sie eine Methode aufrufen möchten, die auf der Änderung des Attributwerts basiert:
Und wenn Sie im Rückruf nicht nach Wertänderungen suchen möchten, können Sie Folgendes tun:
quelle
Ich habe die Frage an vielen Stellen auftauchen sehen, deshalb habe ich ein kleines Rubingem dafür geschrieben, um den Code ein wenig schöner zu machen (und eine Million if / else-Anweisungen überall zu vermeiden): https://github.com/ronna-s / on_change . Ich hoffe das hilft.
quelle
Mit einer gut getesteten Lösung wie dem Juwel state_machine sind Sie viel besser dran .
quelle