我正在访问一个我无法更改的数据库,并且它定义了一个名为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
我不确定这是否重要,但以下是我的环境的详细信息:
UPDATE(解决):
计划A:
select("username, value").where(:username => username, :value => password).first
答案 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会创建x
,x=
和x?
方法。因此,请将此修复程序更新为:
class << self
def instance_method_already_implemented?(method_name)
return true if method_name == 'attribute?'
super
end
end
答案 2 :(得分:0)
也许你可以使用alias_attribute,因此使用不同名称的方法。