我正在访问一个无法更改的数据库,并且它定义了一个名为 attribute
的列。每当我尝试访问属性
时,我都会收到此异常:
属性?由 ActiveRecord(ActiveRecord::DangerousAttributeError) 定义
我的代码:
class User < ActiveRecord::Base
def self.authenticate(username,password)
where(:username => username, :value => password).first
end
end
我在 ruby on Rails 邮件列表上找到了一个解决问题的计划,但对我不起作用
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]
- rails
- 3.0.1 activerecord (3.0.1) activeresource (3.0.1)
更新(已解决):
A计划:
select("username, value").where(:username => username, :value => password).first
最佳答案
ActiveRecord 查询支持 :select
参数,该参数允许您定义想要以字符串形式返回的字段。
通常人们使用类似的东西:
:select => 'field1, field2'
如果您知道数据库服务器的原始查询语言,则可以在选择字符串中使用它。使用 SQL 选择字段时的选项之一是使用 as
修饰符:
select field1 as the_first_field, field2 as the_second_field
数据库将使用新字段名称而不是旧字段名称返回字段。如果您的数据库支持,那么这是一种管理遗留字段的简单方法,这些字段的命名方式与 Rails 冲突。
请参阅《Ruby on Rails 指南》中“Five ActiveRecord Tips”和“Selecting Specific Fields”中的“学习喜爱 ActiveRecord 的 :select 参数”。
以下是我的一个 Rails 应用程序中使用 rails 控制台
访问 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"
关于ruby-on-rails - 如何在具有名为 'attribute' 的列的数据库上使用 ActiveRecord ? (危险属性错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5428987/