【问题标题】:ActiveRecord::DangerousAttributeErrorActiveRecord::DangerousAttributeError
【发布时间】:2011-10-10 21:02:35
【问题描述】:

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

访问时,我得到他的错误:

ActiveRecord::DangerousAttributeError 
attribute? is defined by ActiveRecord

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

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

但这也不行。

谁能推荐一个解决这个问题的方法?我真的很想重命名 rails 中的列!

【问题讨论】:

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


    【解决方案1】:

    在一个类似的问题上,我找到了这个答案: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 确保像 validates_presence_of :attribute 这样的验证将照常工作。

    更多详情请访问https://github.com/bjones/safe_attributes

    【讨论】:

    • 我遇到了同样的问题,我的旧数据库中的属性有效。使用“safe_attributes”确实可以开箱即用。
    • 请注意 Google 员工:这个 gem 几乎适用于任何保留字 除了attribute。来自自述文件:“使用 ActiveRecord 时,几乎不可能在架构中拥有一个名为 'attribute' 的列。”
    • 如果还使用 Hirb,您可能需要先禁用,然后再尝试在控制台中渲染模型列,使用 Hirb.disable。
    【解决方案2】:

    我从来没有遇到过这种情况,但我认为这应该可行

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

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

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

    RadCheck.read_attribute :attribute
    

    希望对你有帮助

    【讨论】:

    • 谢谢 - 我已经尝试过了,但我仍然得到了该死的错误。我是否也需要更改我的控制器操作?目前我有这个:@radcheck = Radcheck.all 谢谢
    【解决方案3】:

    这是一个确实需要更改外部数据库的解决方案,但这是一个非常小的更改,它适用于任何列名,甚至是 `attribute`。不需要宝石。

    在您的外部/旧数据库中创建一个重命名有问题的列的视图。例如

    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  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      • 2017-04-14
      • 2015-06-23
      相关资源
      最近更新 更多