覆盖ActiveRecord模型并定义新的attr_accessible时,如何在不重复的情况下添加?

时间:2013-03-20 15:25:09

标签: ruby-on-rails activerecord override rails-engines

当我使用Rails引擎,并希望覆盖并添加其行为时,我遇到了以下问题:

假设引擎具有名为Course

的ActiveRecord模型
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抱怨说前三个attrs不是Mass-Assignable,所以我不得不重新声明覆盖类中的所有属性,而不是仅仅“重新”添加新属性,如:

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

有没有更好的方法可以不重新声明这些属性,只需添加新属性?

1 个答案:

答案 0 :(得分:0)

查看源代码:

# 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。但是目前还没有代码烘焙过。