Ich erstelle eine unendliche Callback-Schleife, wenn ich ein Attribut während eines after_commit, :on => :create
aktualisieren muss. Es tritt nur auf, wenn ich ein Attribut des Objekts während dieses Rückrufs aktualisieren muss. Gibt es einen Weg dies zu verhindern? Kann ich ein Modell irgendwie dazu zwingen, sich neu zu laden, damit es weiß, dass es ein Update statt eines Creates ausführt?
Sie können die Methode update_column
verwenden, die alle Rückrufe Ihres Modells überspringt:
Oder Sie könnten die Methode update_all
verwenden, die demselben Verhalten folgt
Und zu guter Letzt mein persönlicher Favorit:
%Vor%Dieser macht es ziemlich klar, dass alle Rückrufe ignoriert wurden, was sehr hilfreich ist
Als eine andere Alternative könnten Sie after_create
anstelle von after_commit
verwenden, wenn Sie die Methode generate
nur ausführen möchten, wenn ein neuer Datensatz gespeichert wird
Das Problem ist update_attributes
startet den after_commit
Callback, den Sie benutzt haben
Wie von Rafael erwähnt, müssen Sie entweder einen Callback verwenden, der nicht von update_attributes
ausgelöst wurde, oder eine Update-Methode verwenden, die Callbacks negiert:
update_column
initiiert keine Rückrufe - self.update_column(filename: filename)
after_create
wird nur ausgelöst, wenn Sie einen Datensatz erstellen (nicht update) - after_create :generate
Tags und Links ruby-on-rails activerecord ruby-on-rails-4 callback