Ich versuche, etwas Code zu debuggen. Ein seltsamer Teil ist, dass ein before_save
Callback zweimal aufgerufen wird, obwohl ich nur vorhabe, das Objekt einmal zu speichern.
Um zu verfolgen, wie dies geschieht, habe ich diese Methoden in der Klasse definiert:
%Vor%Von dieser Ausgabe sehe ich nur einen Persistenz-Aufruf.
Ich glaube, dass save
und save!
die einzigen Methoden sind, die bewirken, dass ActiveRecord die Objekte persistent macht. Soweit ich weiß, beruhen andere Persistenzmethoden auf einem dieser beiden; Beispiel: update_attributes
ruft save
, update_attributes!
ruft save!
usw. auf.
Bleiben Methoden für ein ActiveRecord-Objekt bestehen, ohne save
oder save!
?
(Ich benutze ActiveRecord 3.2.13)
In der Rails-Quelle für 3.2.13 finden Sie beide speichern und speichern! Rufen Sie die private Methode create_or_update
auf, um ihre Arbeit zu erledigen. Ich habe git grep
verwendet, um nach anderen Vorkommen von create_or_update
zu suchen und nur Tests und etwas in callbacks.rb
, das es umschließt.
create_or_update
wiederum hängt von klass.connection.update
und self.class.unscoped.insert
ab.
Die Frage ist also vielleicht, ob etwas anderes als create_or_update
ein ActiveRecord-Objekt persistiert.
Betrachten von ActiveRecord 3.2.13 callbacks.rb, Zeile 264. Die Speicherrückrufe werden ausgelöst, wenn create_or_update aufgerufen wird. Diese Methode wird nur von save and save! Aufgerufen. update_column umgeht create_or_update und verwendet stattdessen update_all. first_or_create Aufrufe erstellen, die Aufrufe aufrufen.
Ich würde an zwei Stellen suchen: 1. Wird durch das Speichern ein Speichervorgang in einem verknüpften Datensatz ausgelöst, der versucht, das ursprüngliche Modell erneut zu speichern? Wenn ja, würde ich erwarten, dass die Save-Methode erneut aufgerufen wird, also wahrscheinlich nicht. 2. Sind Sie sicher, dass das before_save aufgerufen wird? Angenommen, Sie haben "before_save: do_something", und do_something wird zweimal aufgerufen. Ruft irgendwas an: do_something außerhalb des Speicherkontexts? Oder ein anderer before_save callback calls: do_something zusätzlich zum Callback?
Tags und Links ruby rails-activerecord