的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