如何在具有名为“attribute”的列的数据库上使用ActiveRecord? (DangerousAttributeError)

时间:2011-03-25 05:48:17

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

我正在访问一个我无法更改的数据库,并且它定义了一个名为attribute的列。每当我尝试访问attribute时,我都会遇到此异常:

属性?由ActiveRecord(ActiveRecord :: DangerousAttributeError)

定义

我的代码:

class User < ActiveRecord::Base
      def self.authenticate(username,password)
        where(:username => username, :value => password).first
      end
end

我在rails邮件列表上的ruby上找到了一个计划,用于解决问题但不适用于我

  class << self
    def instance_method_already_implemented?(method_name)
      return true if method_name == 'attribute'
      super
    end
  end

我不确定这是否重要,但以下是我的环境的详细信息:

  • ruby​​ 1.9.2p0(2010-08-18修订版 29036)[x86_64-darwin10.4.0]
  • 滑轨
  • 3.0.1 activerecord(3.0.1)activeresource(3.0.1)

UPDATE(解决):

计划A:

select("username, value").where(:username => username, :value => password).first

3 个答案:

答案 0 :(得分:2)

ActiveRecord查询支持:select参数,该参数允许您将要返回的字段定义为字符串。

通常人们使用类似的东西:

:select => 'field1, field2'

如果您知道数据库服务器的原始查询语言,则可以在选择字符串中使用该语言。使用SQL选择字段时的一个选项是使用as修饰符:

select field1 as the_first_field, field2 as the_second_field

并且数据库将使用新字段名称而不是旧字段名称返回字段。如果您的数据库支持,那么管理以与Rails冲突的方式命名的旧字段是一种简单的方法。

参见&#34;学会喜欢ActiveRecord&#39; s:选择参数&#34; in&#34; Five ActiveRecord Tips&#34;和&#34; Selecting Specific Fields&#34;在Ruby on Rails指南中。

以下是我的一个Rails应用使用rails console访问我的Postgres数据库的示例:

ruby-1.9.2-p180 :007 > dn = DomainName.first
 => #<DomainName id: 1, domain_name: "ip72-208-155-230.ph.ph.cox.net", created_at: "2010-04-20 05:53:22", updated_at: "2010-04-20 05:53:22"> 
ruby-1.9.2-p180 :008 > dn = DomainName.first(:select => 'id, domain_name as dn')
 => #<DomainName id: 1> 
ruby-1.9.2-p180 :009 > dn['id']
 => 1 
ruby-1.9.2-p180 :010 > dn['dn']
 => "ip72-208-155-230.ph.ph.cox.net"

答案 1 :(得分:1)

对于列x,ActiveRecord会创建xx=x?方法。因此,请将此修复程序更新为:

class << self
    def instance_method_already_implemented?(method_name)
        return true if method_name == 'attribute?'
        super
    end
end

答案 2 :(得分:0)

也许你可以使用alias_attribute,因此使用不同名称的方法。