Подтвердить что ты не робот

Какую роль имеют конструкторы модели ActiveRecord в Rails (если они есть)?

Я только что читал этот вопрос, который посвящен присвоению полю даты модели ActiveRecord значения по умолчанию. Принятый ответ показывает, как установить значение по умолчанию из контроллера. На мой взгляд, такая бизнес-логика действительно принадлежит самой модели.

Затем я подумал, как если бы это была Java, я бы, вероятно, установил начальное значение поля при объявлении переменной экземпляра или внутри конструктора. Поскольку поля с поддержкой базы данных не обязательно должны быть явно объявлены в моделях ActiveRecord, это то, что вы могли бы использовать для метода модели initialize? Мне любопытно, потому что я действительно не видел много использования конструкторов для моделей ActiveRecord в коде Rails, на который я смотрел. Они играют какую-то роль, и если да, то что это?

4b9b3361

Ответ 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, который он действительно инициализирует правильно.