Ruby on Rails Callback, was ist der Unterschied zwischen: before_save und: before_create?

183

Können Sie detailliert erklären, was die Rückrufe :before_saveund :before_createRuby on Rails sind und was sie mit Rails-Validierungen zu tun haben? Erfolgt die Validierung nach :before_saveoder :before_create?

Agung Prasetyo
quelle

Antworten:

363

Bei einer Erstellungsoperation unter Rails gibt es sechs Rückrufe vor der Datenbankoperation und zwei danach. In der Reihenfolge sind dies:

  1. before_validation
  2. before_validation_on_create
  3. after_validation
  4. after_validation_on_create
  5. before_save
  6. before_create

    DATENBANK EINFÜGEN
  7. after_create
  8. after_save

Aktualisierungsvorgänge haben genau den gleichen Satz, außer dass Lesen updatestatt createüberall (und UPDATE anstelle von EINFÜGEN ).

Daraus können Sie ersehen, dass die Validierung vor dem before_saveund den before_createRückrufen durchgeführt wird.

Das before_savetritt kurz vor dem auf before_create. Nach meinem besten Wissen passiert nichts zwischen ihnen; wird aber before_saveauch bei Aktualisierungsvorgängen ausgelöst, während before_createnur bei Erstellungsvorgängen ausgelöst wird.

Chowlett
quelle
27
before_validation_on_createund after_validation_on_createwerden als von Rails 3 entfernt , stattdessen verwenden before_validationund after_validationjeweils mit Option :on => :create.
So
Wie würden Sie sich auf den Datensatz beziehen, der gerade bei der Verwendung von after_saveoder erstellt wurde after_create?
bcackerman
@bcackerman - im after_saveoder after_createRückruf selfist der Datensatz, der gerade gespeichert wurde, wie er nach dem Speichern vorhanden ist. Das schließt automatisch generierte Felder mögen id, created_at, updated_at.
Chowlett
Denken Sie auch daran before_create, dass ein neues Objekt in der Datenbank gespeichert wird und nicht die eigentliche createMethode, die aufgerufen wird. Somit before_createkann auch von der saveMethode noch abgefeuert werden.
Steve
1
@Rads - ähm, nein? Die Dokumente listen immer noch den before_save3. und before_create5. Platz auf.
Chowlett
136

before_savewird jedes Mal aufgerufen, wenn ein Objekt gespeichert wird. Also für neue und bestehende Objekte. (Aktion erstellen und aktualisieren)

before_createnur vor der Schöpfung. Also nur für neue Objekte (Aktion erstellen)

Michael Koper
quelle