的ActiveRecord :: DangerousAttributeError
我必须连接到我们的freeradius服务器使用的现有数据库。 一个表有一个名为属性的列,我正在尝试访问该列。
访问时,我收到他的错误:
ActiveRecord::DangerousAttributeError attribute? is defined by ActiveRecord
我试图在我的模型中选择并重命名此列:
def self.default_scope Radcheck.select("attribute as newattribute") end
但那也没有用。
任何人都可以推荐一种方法吗? 我真的想在rails中重命名列!
在类似的问题上我找到了这个答案: https : //stackoverflow.com/a/9106597/1266906
无需关心Rails 3.0中ActiveRecord保留哪些属性,只需添加即可
gem 'safe_attributes'
到您的Gemfile
,gem将尝试自动处理所有冲突的名称。
与其他答案一样,您需要使用Radcheck[:attribute]
或Radcheck.read_attribute :attribute
/ Radcheck.write_attribute :attribute, 'value'
来访问具有内部保留名称的字段,但gem确保validation如validates_presence_of :attribute
将作为通常。
有关详细信息,请访问https://github.com/bjones/safe_attributes
我从来没有碰到这种情况,但我认为这应该有效
class Radcheck < ActiveRecord::Base default_scope :select=> 'attribute as newattribute' end
您应该使用实例方法default_scope而不是第一类
您还可以选择使用实例方法,例如:
RadCheck.read_attribute :attribute
希望能帮助到你
这是一个需要更改外部数据库的解决方案,但这是一个非常小的更改,它可以使用任何列名甚至`属性`。 不需要gem。
在外部/旧数据库中,创建一个重命名有问题列的视图。 例如
CREATE VIEW radcheck_view AS ( SELECT id, username, op, value, attribute rad_attribute FROM radcheck );
这里将问题列重命名为rad_attribute
。
不要忘记在视图上授予适当的权限。 在我的情况下,它是只读用法:
GRANT SHOW VIEW ON radius.radcheck_view TO IDENTIFIED BY '';
然后,在rails模型中使用视图作为table_name
class RadiusRadcheck < RadiusExternal self.table_name = 'radcheck_view' end