Sind 'Speichern' und 'Speichern!' die einzigen Methoden, die ActiveRecord-Objekte beibehalten?

9

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! ?

aufzurufen

(Ich benutze ActiveRecord 3.2.13)

Aktualisieren

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.

    
Nathan Long 07.06.2013, 12:22
quelle

1 Antwort

1

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?

    
davidfurber 08.06.2013 03:05
quelle

Tags und Links