Какую роль играют конструкторы модели ActiveRecord в Rails (если есть)? - PullRequest
16 голосов
/ 11 ноября 2009

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

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

Ответы [ 3 ]

21 голосов
/ 11 ноября 2009

Я делаю это довольно часто для значений по умолчанию. Это работает хорошо и все еще позволяет пользователю изменять это. Помните, что метод инициализации вызывается, когда вы говорите MyObject.new. Тем не менее, вы можете прочитать эту запись в блоге (хотя и немного устаревшую) об использовании initialize.

Вы должны использовать after_initialize вместо initialize. ActiveRecord :: Base требуется метод initialize для подготовки многих вспомогательных методов. Если в вашей модели определен after_initialize метод, он вызывается как обратный вызов для new, create, find и любых других методов, которые генерируют экземпляры вашей модели.

В идеале вы бы хотели определить это так:

def after_initialize
  @attribute ||= default_value
end

Также обратите внимание, что вы не можете использовать этот обратный вызов как другие, вы должны определить метод с именем after_initialize (как выше), чтобы он работал Вы не можете сделать следующее:

after_initialize :run_some_other_method
3 голосов
/ 10 апреля 2015

@ Ответ TopherFangio правильный. Похоже, что ActiveRecord API изменился некоторое время между его ответом (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, что он действительно инициализируется правильно.

2 голосов
/ 11 ноября 2009

Согласно этому блогу , активная запись не всегда использует new, поэтому инициализация может не вызываться для вашего объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...