Ruby on Rails Callback, чим відрізняється: before_save та: before_create?


184

Не могли б ви детально пояснити, що таке зворотні виклики :before_saveі :before_createRuby on Rails, і що вони мають відношення до перевірки Rails? Чи відбувається перевірка після :before_saveабо :before_create?

Відповіді:


363

У операції створення під Rails існує шість зворотних зворотних дзвінків перед операцією з базою даних та два після. Для того, це:

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

    ДАТАБАЗНА ВСТАВКА
  7. after_create
  8. after_save

Операції оновлення мають однаковий набір, за винятком читання, updateа не createскрізь (і ОНОВЛЕННЯ замість INSERT ).

З цього ви бачите, що перевірка проводиться перед зворотними before_saveі before_createзворотними дзвінками.

before_saveЗлегка відбувається до before_create. Наскільки мені відомо, між ними нічого не відбувається; але before_saveтакож буде запущено на Оновленнях операцій, в той час як before_createбуде запускатись лише на Creates.


27
before_validation_on_createі after_validation_on_createвидаляються з Rails 3 , замість цього використовуйте before_validationта after_validationвідповідно з опцією :on => :create.
Нд

Як би ви ставилися до запису, який щойно створений під час використання after_saveабо after_create?
bcackerman

@bcackerman - у зворотному after_saveабо after_createзворотному дзвінку - selfце запис, який щойно збережено, як він існує після збереження. Це включає в себе автогенеріруемие областях , як id, created_at, updated_at.
Chowlett

Також пам’ятайте, що before_createйдеться про новий об'єкт, який зберігається в базі даних, а не фактичний createметод, що викликається. Таким чином, before_createвсе одно можна звільнити навіть із saveметоду.
Стів

1
@Rads - е, ні? Документи все ще перераховують before_save3-е та before_create5-е.
Chowlett

136

before_saveназивається кожен раз, коли об’єкт зберігається. Так для нових та існуючих об’єктів. (створення та оновлення дій)

before_createлише перед створенням. Тож лише для нових об’єктів (створити дії)


3

before_create проти before_save :on => :create

Іноді доводиться бути обережними щодо порядку зворотних дзвінків

Детальніше дивіться тут: http://pivotallabs.com/activerecord-callbacks-autosave-before-this-and-that-etc/


5
before_save :on => :createне працює (принаймні на рейках 3.2)
культайон

1
Ви можете скористатись:before_save :generate_api_key, :if => :new_record?
Каспер Груббе
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.