Der after_find
Rückruf wird nicht von Ihrem where
Aufruf aufgerufen wird; Es wird durch Ihren Anruf destroy_all
aufgerufen. destroy_all
wird jedes UserProfile
-Objekt (und seine zugeordneten Objekte) instanziieren und seine destroy
-Methode eins nach dem anderen aufrufen.
Wenn Sie sofort alle UserProfile
Objekte löschen möchten, ohne sie zu instanziieren (und alle Rückrufe Skipping), dann kann man nennen:
UserProfile.where(user_id: user_id).delete_all
Weitere Informationen zu den Unterschieden zwischen destroy_all
and delete_all
finden Sie in andere Antworten auf Stackoverflow, aber die Unterschiede über die Sie sich interessieren, sind:
- es wird die Aufzeichnung nicht instanziiert
- es wird nicht zugeordneten Objekte
- löschen alle Rückrufe
nicht berufen werde ich würde empfehlen, dass Sie so, wie Sie es verwenden nicht after_find
verwenden. Es gibt lots of ways to skip callbacks aber almost nobody uses after_find
. (im Vergleich zu after_create
, zum Beispiel)
Die Optionen zum Überspringen after_find
Rückrufe sind begrenzt. Dafür gibt es keine built-in Rails methods. (Außer wie oben beschrieben) Wenn Sie unbedingt den Rückruf halten müssen, dann Ihre beste Wette ist eine bedingte an die Callback-Definition hinzuzufügen:
after_find :foo, if: -> { <some logic> }
Wenn Sie eine bedingte so verwenden, dann müssen Sie anfangen, darüber nachzudenken wie diese Variable in einer Multithread-Umgebung gelesen und gesetzt wird und wie man gleichzeitige Anfragen bearbeitet, ohne eine Race-Bedingung zu erzeugen, und einen unschönen Pfad einschlägt, der besser gehandhabt wird, indem man after_find
nicht wie beschrieben verwendet.
Aus welchem Dokument haben Sie diese Informationen erhalten? Die [rails documentation] (http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html) sagt: * "ein' after_find'- und 'after_initialize'-Callback wird für jedes gefundene Objekt ausgelöst und von einem Finder instanziiert "*. Und die Methoden 'find_by_ *' wurden seit v4 veraltet/aus den Core-Rails entfernt und komplett in den Rails 5 entfernt. –
Kannst du bitte deinen Code zeigen? Was meinst du mit "in einigen Fällen deaktivieren"? Es gibt wahrscheinlich eine sauberere Lösung für Ihr Problem, die überhaupt nicht "nachher" betrifft. –
Sah in http://guides.rubyonrails.org/active_record_callbacks.html. Hat den Code auch hinzugefügt. –