При переопределении модели ActiveRecord и определении нового атрибута attr_accessible, как добавить без дублирования?

Когда я использую Rails Engine и хочу переопределить и добавить к его поведению, я столкнулся со следующей проблемой:

Скажем, в Engine есть модель ActiveRecord с именем Course.

module MyEngine
  class Course < ActiveRecord::Base

    attr_accessible :name, :description, :price

  end
end

И я хочу создать миграцию в своем основном приложении Rails, добавить в нее столбец, и мне нужно добавить этот новый столбец в attr_accessible (чтобы его можно было массово назначать)

MyEngine::Course.class_eval do
  attr_accessible :expiration_date
end

Но затем Rails жалуется, что первые 3 атрибута не являются массово назначаемыми, поэтому вместо того, чтобы просто «добавить» новый атрибут в переопределение, мне нужно повторно объявить все атрибуты в переопределенном классе, например:

MyEngine::Course.class_eval do 
  attr_accessible :name, :description, :price, :expiration_date
end

Есть ли лучший способ не объявлять эти атрибуты повторно, а просто добавить новый атрибут?


person Timothy Johnson    schedule 20.03.2013    source источник


Ответы (1)


Глядя на исходный код:

# File activemodel/lib/active_model/mass_assignment_security.rb, line 174
def attr_accessible(*args)
  options = args.extract_options!
  role = options[:as] || :default

  self._accessible_attributes = accessible_attributes_configs.dup

  Array.wrap(role).each do |name|
    self._accessible_attributes[name] = self.accessible_attributes(name) + args
  end

  self._active_authorizer = self._accessible_attributes
end

Вы можете попытаться использовать одну из внутренних структур данных для восстановления атрибутов, которые уже были определены, чтобы не дублировать код, или вы можете взломать свой путь и создать новый метод, который позволит вам «добавлять» значения к attr_accessible. Но для этого пока нет готового кода.

person Gabriel Mazetto    schedule 15.04.2013