Was ist der Unterschied zwischen "after_create" und "after_save" und wann welche verwendet werden?

124

Sind after_createund after_savegleich nach Funktionalität?

Ich möchte einen Vorgang mit der E-Mail eines Benutzers nach dessen Kontoerstellung ausführen.

Ich möchte diesen Vorgang ausführen, wenn er in der Datenbank gespeichert ist.

welches ist vorzuziehen zu verwenden: after_createoder after_save?

Swapnil Chincholkar
quelle

Antworten:

212

after_create funktioniert nur einmal - kurz nachdem der Datensatz zum ersten Mal erstellt wurde.

after_save funktioniert jedes Mal, wenn Sie das Objekt speichern - auch wenn Sie es erst viele Jahre später aktualisieren

Wenn Sie diesen E-Mail-Vorgang also nur einmal (und dann nie wieder) ausführen möchten, verwenden Sie ihn after_create.

Wenn Sie dies jedes Mal tun möchten, wenn das Objekt gespeichert wird, tun Sie es inafter_save

Taryn East
quelle
2
Leser , dass sollten beachten, nach der Dokumentation , Active ist update_allnicht invoke irgendwelche Rückrufe, darunterafter_*
user2426679
93

Aus den Dokumenten :

after_create()

Wird Base.savefür neue Objekte aufgerufen , die noch nicht gespeichert wurden (es ist kein Datensatz vorhanden).

after_save()

Wird nach aufgerufen Base.save (unabhängig davon, ob es sich um ein Erstellen oder Aktualisieren handelt).

Michael Kohl
quelle
1
after_save()

Funktioniert gut, wenn Sie Modelle speichern müssen, die nicht sehr oft gespeichert werden. Für dieses spezielle Beispiel für häufiges Ändern von Datensätzen ist die Verwendung ratsam

 after_commit()

Stellen Sie sicher, dass das Modell in der Datenbank gespeichert ist, bevor die Aktion nach_commit: berechne_Kredit_score ausgeführt wird

def calculate_credit_score
     #Call a Cron job
end
pensebien
quelle
Sie raten zur Verwendung after_commit, erklären aber nicht warum. Können Sie bitte näher darauf eingehen? Beachten Sie, dass after_commitbeim Erstellen, Aktualisieren und Zerstören ausgeführt wird. Docs: apidock.com/rails/ActiveRecord/Transactions/ClassMethods/… Es ist also nicht dasselbe Verhalten, nach dem after_saveSie diesen cron_job wirklich aufrufen möchten, nachdem Sie den Datensatz zerstört haben? Oder senden Sie im Fall ops eine E-Mail an einen jetzt gelöschten Benutzer? Seien Sie vorsichtig mitafter_commit
rmcsharry
after_commitwird für diese CRUD-Vorgänge ausgeführt. Wenn in seinem Fall die E-Mail häufig aktualisiert wird, ist es einfacher, die Aktion für einen bestimmten Rückruf zu kombinieren. In meinem Fall habe ichafter_commit : calculate_profile_update, on: :update
pensebien