Да, все ваши проверки выполняются до обратного вызова before_save
. Полный список в порядке см. http://guides.rubyonrails.org/active_record_validations_callbacks.html#available-callbacks.
Я бы порекомендовал использовать after_initialize
. Это действительно то, для чего он предназначен. Это означает, что он вызывается для объектов, когда они загружаются из базы данных, а также при их первом создании. Другими словами, их атрибуты соответствуют вашим ожиданиям.
class User
def after_initialization
self.foobar ||= 'default value'
end
end
Из документов :
Обратный вызов after_initialize будет
вызывается всякий раз, когда активная запись
объект создается, либо
непосредственно с использованием нового или когда запись
загружен из базы данных. Может быть
полезно избегать необходимости напрямую
переопределить вашу активную запись инициализации
способ.
Будет вызван обратный вызов after_find
всякий раз, когда Active Record загружает запись
из базы данных. after_find is
вызывается до after_initialize, если оба
определены.
After_initialize и after_find
обратные вызовы немного отличаются от
другие. У них нет до этого *
коллеги, и единственный способ
зарегистрировать их, определив их как
обычные методы. Если вы попытаетесь
зарегистрироваться after_initialize или
after_find с использованием класса в стиле макроса
методы, они будут просто игнорироваться.
Такое поведение связано с производительностью
причины, так как after_initialize и
after_find будет вызван для обоих
каждая запись найдена в базе данных,
значительно замедляя
запросы.