Verhindert Endlosschleife beim Aktualisieren von Attributen innerhalb von after_commit,: on =: create

8

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?

%Vor%     
Alec Sanger 21.03.2014, 19:00
quelle

3 Antworten

17

Sie können die Methode update_column verwenden, die alle Rückrufe Ihres Modells überspringt:

%Vor%

Oder Sie könnten die Methode update_all verwenden, die demselben Verhalten folgt

%Vor%

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

    
Rafael Ramos Bravin 21.03.2014, 19:30
quelle
1

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

    
Richard Peck 22.03.2014 11:28
quelle
0

Es ist ein Fehler, siehe die Github-Ausgabe Ссылка

    
Sefier Tang 25.07.2014 04:13
quelle