的ActiveRecord :: DangerousAttributeError

时间:2011-10-10 21:02:35

标签: ruby-on-rails ruby-on-rails-3 activerecord

我必须连接到我们的freeradius服务器使用的现有数据库。一个表有一个名为属性的列,我试图访问它。

访问时,我收到了他的错误:

ActiveRecord::DangerousAttributeError 
attribute? is defined by ActiveRecord

我尝试在我的模型中选择并重命名此列:

def self.default_scope
    Radcheck.select("attribute as newattribute")
end

但那也不起作用。

有人可以推荐一种方法吗?我真的想在rails中重命名列!

3 个答案:

答案 0 :(得分:11)

在类似的问题上,我找到了这个答案:https://stackoverflow.com/a/9106597/1266906

无需关心Rails 3.0中ActiveRecord保留哪些属性,只需添加

即可
gem 'safe_attributes'

到你的Gemfile,宝石会尝试自动处理所有碰撞名称。

与其他答案一样,您需要使用Radcheck[:attribute]Radcheck.read_attribute :attribute / Radcheck.write_attribute :attribute, 'value'来访问具有内部保留名称的字段,但gem确保validates_presence_of :attribute之类的验证可以正常工作像往常一样。

有关详细信息,请访问https://github.com/bjones/safe_attributes

答案 1 :(得分:2)

我从未遇到过这样的情况,但我认为这应该有效

class Radcheck < ActiveRecord::Base
    default_scope :select=> 'attribute as newattribute'
end

您应该使用实例方法default_scope而不是第一类

您还可以选择使用实例方法,例如:

RadCheck.read_attribute :attribute

希望有所帮助

答案 2 :(得分:0)

这是一个需要更改外部数据库的解决方案,但这是一个非常小的更改,它可以使用任何列名甚至`属性`。不需要宝石。

在外部/旧版数据库中,创建一个重命名有问题列的视图。 e.g。

CREATE VIEW radcheck_view AS (
  SELECT id, username, op, value, attribute rad_attribute 
  FROM radcheck
);  

此处将问题列重命名为attributerad_attribute

不要忘记为视图授予适当的权限。就我而言,它是只读用法:

GRANT SHOW VIEW ON radius.radcheck_view TO <rails_user> IDENTIFIED BY '<password>';

然后,在您的rails模型中使用视图table_name

class RadiusRadcheck < RadiusExternal
    self.table_name = 'radcheck_view'
end