我必须连接到我们的freeradius服务器使用的现有数据库。一个表有一个名为属性的列,我试图访问它。
访问时,我收到了他的错误:
ActiveRecord::DangerousAttributeError
attribute? is defined by ActiveRecord
我尝试在我的模型中选择并重命名此列:
def self.default_scope
Radcheck.select("attribute as newattribute")
end
但那也不起作用。
有人可以推荐一种方法吗?我真的想在rails中重命名列!
答案 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
之类的验证可以正常工作像往常一样。
答案 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
);
此处将问题列重命名为attribute
至rad_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