Ruby on Rails Callback, jaka jest różnica między: before_save a: before_create?

184

Czy mógłbyś szczegółowo wyjaśnić, czym są wywołania zwrotne :before_savei :before_createRuby on Rails i co mają wspólnego z sprawdzaniem poprawności Rails? Czy sprawdzanie poprawności następuje po :before_saveczy :before_create?

Agung Prasetyo
źródło

Odpowiedzi:

363

W operacji tworzenia w Railsach jest sześć wywołań zwrotnych przed operacją bazy danych i dwa po niej. W kolejności są to:

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

    WSTAWIENIE BAZ DANYCH
  7. after_create
  8. after_save

Operacje aktualizacji mają dokładnie ten sam zestaw, z wyjątkiem odczytu updatezamiast createwszędzie (i UPDATE zamiast INSERT ).

Z tego widać, że walidacja jest przeprowadzane przed before_savei before_createwywołania zwrotne.

before_saveWystępuje nieznacznie przed before_create. Według mojej najlepszej wiedzy między nimi nic się nie dzieje; ale before_savebędzie też strzelał podczas operacji Aktualizacji, podczas gdy before_createbędzie strzelał tylko dla Creates.

Chowlett
źródło
27
before_validation_on_createi after_validation_on_createsą usuwane od wersji 3 , zamiast tego użyj before_validationi after_validationodpowiednio z opcją :on => :create.
niedziela,
Jak odnosiłbyś się do rekordu, który został właśnie utworzony podczas używania after_savelub after_create?
bcackerman,
@ backackerman - w after_savelub after_createcallback, selfto zapis, który właśnie został zapisany, ponieważ istnieje po zapisaniu. Że zawiera wygenerowany automatycznie dziedzinach jak id, created_at, updated_at.
Chowlett,
Pamiętaj także, że before_createodnosi się do nowego obiektu zapisywanego w bazie danych, a nie do createwywoływanej metody. W ten sposób before_createmożna nadal zwolnić nawet z savemetody.
Steve,
1
@Rads - er, nie? Dokumenty wciąż wymieniają before_save3. i before_create5. pozycję.
Chowlett,
136

before_savejest wywoływany za każdym razem, gdy obiekt jest zapisywany. Tak dla nowych i istniejących obiektów. (utwórz i zaktualizuj akcję)

before_createtylko przed stworzeniem. Więc tylko dla nowych obiektów (utwórz akcję)

Michael Koper
źródło