Какую роль имеют конструкторы модели ActiveRecord в Rails (если они есть)?
Я только что читал этот вопрос, который посвящен присвоению полю даты модели ActiveRecord значения по умолчанию. Принятый ответ показывает, как установить значение по умолчанию из контроллера. На мой взгляд, такая бизнес-логика действительно принадлежит самой модели.
Затем я подумал, как если бы это была Java, я бы, вероятно, установил начальное значение поля при объявлении переменной экземпляра или внутри конструктора. Поскольку поля с поддержкой базы данных не обязательно должны быть явно объявлены в моделях ActiveRecord, это то, что вы могли бы использовать для метода модели initialize
? Мне любопытно, потому что я действительно не видел много использования конструкторов для моделей ActiveRecord в коде Rails, на который я смотрел. Они играют какую-то роль, и если да, то что это?
Ответы
Ответ 1
Я делаю это довольно часто для значений по умолчанию. Он работает хорошо и по-прежнему позволяет пользователю изменить его. Помните, метод initialize вызывается, когда вы говорите MyObject.new
. Тем не менее, вы можете прочитать эту запись в блоге (хотя и немного устаревшую) об использовании initialize
.
Вы должны использовать after_initialize
вместо initialize
. Метод инициализации требуется ActiveRecord:: Base для подготовки многих удобных методов. Если в вашей модели определен метод after_initialize
, он вызывается как обратный вызов для нового, создания, поиска и любых других методов, которые генерируют экземпляры вашей модели.
В идеале вы хотите определить его так:
def after_initialize
@attribute ||= default_value
end
Также обратите внимание: вы не можете использовать этот обратный вызов, как другие, вы должны определить метод с именем after_initialize (например, выше), чтобы он работал. Вы не можете сделать следующее:
after_initialize :run_some_other_method
Ответ 2
В соответствии с этим blog активная запись не всегда использует новую, поэтому инициализация может не вызываться на вашем объекте.
Ответ 3
Ответ на @TopherFangio правильный. Кажется, что API ActiveRecord изменил время между его ответом (2009) и теперь (2015).
На сегодняшний день (Rails 4 с ActiveRecord 4.2.0), здесь, как вы добавляете инициализаторы в соответствии с документами ActiveRecord:
class Widget < ActiveRecord::Base
after_initialize |new_widget|
new_widget.name ||= 'Unnamed Widget'
end
end
Вы можете проверить с помощью операторов puts
или путем проверки нового объекта из rails console
, который он действительно инициализирует правильно.