Der #new_record? Funktion bestimmt, ob ein Datensatz gespeichert wurde. Aber es ist immer falsch im after_save
Haken. Gibt es eine Möglichkeit, anhand der Aktualisierung festzustellen, ob es sich bei dem Datensatz um einen neu erstellten oder einen alten Datensatz handelt?
Ich hoffe, keinen weiteren Rückruf before_create
zu verwenden, um beispielsweise ein Flag im Modell zu setzen oder eine weitere Abfrage in der Datenbank zu erfordern.
Jeder Rat wird geschätzt.
Bearbeiten: Sie müssen es im after_save
Hook bestimmen , und für meinen speziellen Anwendungsfall gibt es keinen updated_at
oder updated_on
Zeitstempel
ruby-on-rails
activerecord
activemodel
Aaron Qian
quelle
quelle
Antworten:
Ich wollte dies für einen
after_save
Rückruf verwenden.Eine einfachere Lösung ist die Verwendung
id_changed?
(da sie sich nicht ändertupdate
) oder auchcreated_at_changed?
wenn Zeitstempelspalten vorhanden sind.Update: Wie @mitsy hervorhebt, verwenden Sie diese Option, wenn diese Prüfung außerhalb von Rückrufen erforderlich ist
id_previously_changed?
. Siehe Dokumente .quelle
after_save
.id_changed?
wird nach dem Speichern des Datensatzes falsch sein (zumindest außerhalb der Hooks). In diesem Fall können Sieid_previously_changed?
Keine Schienenmagie hier, von der ich weiß, du musst es selbst tun. Sie können dies mit einem virtuellen Attribut bereinigen ...
In Ihrer Modellklasse:
quelle
Eine weitere Option für diejenigen , die zu tun haben einen
updated_at
Zeitstempel:quelle
created_at
,updated_at
einenafter_save
Rückruf zu einem anderen Zeitpunkt als dem Zeitpunkt seiner ersten Erstellung gleichzustellen ?"created_at
undupdated_at
wird in einemafter_save
Rückruf gleich sein. In allen anderen Situationen sind sie imafter_save
Rückruf nicht gleich .Es gibt einen
after_create
Rückruf, der nur aufgerufen wird, wenn der Datensatz nach dem Speichern ein neuer Datensatz ist . Es gibt auch einenafter_update
Rückruf zur Verwendung, wenn dies ein vorhandener Datensatz war, der geändert und gespeichert wurde. Derafter_save
Rückruf wird in beiden Fällen entweder nachafter_create
oderafter_update
aufgerufen.Verwenden
after_create
Sie diese Option, wenn nach dem Speichern eines neuen Datensatzes einmal etwas passieren muss.Weitere Informationen hier: http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html
quelle
Da das Objekt bereits gespeichert wurde, müssen Sie sich die vorherigen Änderungen ansehen. Die ID sollte sich erst nach einer Erstellung ändern.
Es gibt auch eine Instanzvariable
@new_record_before_save
. Sie können darauf zugreifen, indem Sie folgende Schritte ausführen:Beide sind ziemlich hässlich, aber Sie können feststellen, ob das Objekt neu erstellt wurde. Hoffentlich hilft das!
quelle
after_save
Rückruf mit Rails 4 in Byebug und keiner von beiden arbeitet daran, diesen neuen Datensatz zu identifizieren.@object.previous_changes[:id].any?
ist ganz einfach und elegant. Es funktioniert für mich, nachdem der Datensatz aktualisiert wurde (ich rufe ihn nicht anafter_save
).@object.id_previously_changed?
ist ein bisschen weniger hässlich.after_save
auf Rails 4, die Sie sichchanges[:id]
stattdessen ansehen möchtenprevious_changes[:id]
. Dies ändert sich jedoch in Rails5.1 (siehe Diskussion in github.com/rails/rails/pull/25337 )previous_changes.key?(:id)
zum besseren Verständnis.Schienen 5.1+ Weg:
quelle
Für Rails 4 (aktiviert in 4.2.11.1) sind Ergebnisse
changes
undprevious_changes
Methoden leere Hashes{}
bei der Objekterstellung im Innerenafter_save
. Soattribute_changed?
Methoden wieid_changed?
nicht funktionieren wie erwartet.Sie können dieses Wissen jedoch nutzen und - wenn Sie wissen, dass mindestens 1 Attribut
changes
beim Update vorhanden sein muss - prüfen, obchanges
es leer ist. Sobald Sie bestätigt haben, dass es leer ist, müssen Sie sich während der Objekterstellung befinden:quelle
Ich bin gerne spezifisch, auch wenn ich mir bewusst bin, dass sich
:id
das nicht normal ändern sollte, aberEs ist immer billiger, spezifisch zu sein, anstatt einen sehr seltsamen, unerwarteten Fehler zu finden.
Genauso, wenn ich eine
true
Flagge von einem nicht vertrauenswürdigen Argument erwarteDies spart viele Stunden, um nicht auf seltsamen Käfern zu sitzen.
quelle