Ruby on Rails Callback, в чем разница между: before_save и: before_create?

184

Не могли бы вы подробно объяснить, что такое обратные вызовы Ruby :before_saveи :before_createRails и как они связаны с валидациями 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везде (и ОБНОВЛЕНИЕ вместо ВСТАВКИ ).

Исходя из этого, вы можете увидеть , что проверка проводится до before_saveи before_createобратных вызовов.

before_saveСлегка происходит до before_create. Насколько я знаю, между ними ничего не происходит; но before_saveтакже срабатывает при операциях обновления, а before_createсрабатывает только при создании.

Chowlett
источник
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.
Чоулетт
Также помните, before_createчто новый объект сохраняется в базе данных, а не фактический createвызываемый метод. Таким образом, before_createвсе еще можно уволить даже из saveметода.
Стив
1
@Rads - ну нет? Документы по-прежнему перечислены before_save3-й и before_create5-й.
Чоулетт
136

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

before_createтолько до создания. Так что только для новых объектов (создать действие)

Майкл Копер
источник
3

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

Иногда вы должны быть осторожны с порядком обратных вызовов

Смотрите здесь для получения более подробной информации: http://pivotallabs.com/activerecord-callbacks-autosave-before-this-and-that-etc/

23inhouse
источник
5
before_save :on => :createне работает (по крайней мере, на рельсах 3.2)
cutalion
1
Вы можете использовать:before_save :generate_api_key, :if => :new_record?
Kasper Grubbe