ActiveRecord::DangerousAttributeError

14

我需要连接到我们的freeradius服务器使用的现有数据库。其中一个表格有一个名为attribute的列,我正在尝试访问它。

在访问时,我收到了如下错误:

ActiveRecord::DangerousAttributeError 
attribute? is defined by ActiveRecord

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

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

但是那样也不起作用。

有人可以推荐一个解决方案吗?我真的很想在Rails中重命名这个列!

3个回答

11

在一个类似的问题上,我找到了这个答案:https://dev59.com/J3I_5IYBdhLWcg3wJPdu#9106597

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

gem 'safe_attributes'

将gem添加到您的Gemfile中,该gem将尝试自动处理所有冲突的名称。

与其他答案一样,您需要使用Radcheck[:attribute]Radcheck.read_attribute :attribute/Radcheck.write_attribute :attribute,'value'来访问内部保留名称的字段,但宝石确保像validates_presence_of :attribute这样的验证将像往常一样工作。

更多详细信息请参见https://github.com/bjones/safe_attributes


1
我在我的传统数据库中遇到了一个属性有效的相同问题。使用“safe_attributes”可以直接解决这个问题。 - dhenze
2
仅供谷歌员工参考:这个宝石几乎可以用于任何保留字,除了 attribute。从自述文件中可以看到:“当使用ActiveRecord时,在模式中几乎不可能有一个名为'attribute'的列。” - Chris Bloom
如果同时使用Hirb,可能需要在尝试在控制台中呈现模型列之前禁用它,使用Hirb.disable。 - Anatortoise House

2

我从未遇到过这种情况,但我认为这应该可以解决问题。

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

你应该使用实例方法 default_scope 而不是类方法。

另外,你也可以使用实例方法,例如:

RadCheck.read_attribute :attribute

希望这能有所帮助。

谢谢 - 我已经尝试过了,但我仍然得到了这个烦人的错误。我需要同时更改我的控制器操作吗?目前我有这个:@radcheck = Radcheck.all - Jenny Blunt

-1

这里有一个解决方案,它需要对外部数据库进行一些更改,但这是非常小的更改,并且它可以适用于任何列名,甚至是 `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 <rails_user> IDENTIFIED BY '<password>';

然后,在你的Rails模型中使用视图作为table_name
class RadiusRadcheck < RadiusExternal
    self.table_name = 'radcheck_view'
end  

考虑到外部数据库将被不同的应用程序所拥有和管理,这是一个相当危险的想法,即使它能够工作,由于外部结构不应该被读取应用程序修改,因此这也是不可行的。 - shashin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接