如何在具有名为“attribute”的列的数据库上使用ActiveRecord? (DangerousAttributeError)
我正在访问一个我无法更改的数据库,它有一个名为attribute
的列定义。 无论何时我尝试访问attribute
,我都会遇到以下exception:
属性? 由ActiveRecord定义(ActiveRecord :: DangerousAttributeError)
我的代码:
class User 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]
- 轨道
- 3.0.1 activerecord(3.0.1)activeresource(3.0.1)
UPDATE(解决):
计划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 ”和“ 选择特定字段 ”中的“Learn to Love ActiveRecord’s:select Parameter”。
以下是我的一个Rails应用程序使用rails console
访问我的Postgres数据库的示例:
ruby-1.9.2-p180 :007 > dn = DomainName.first => # ruby-1.9.2-p180 :008 > dn = DomainName.first(:select => 'id, domain_name as dn') => # 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"
对于列x
,ActiveRecord创建x
, x=
和x?
方法。 因此,请将此修复程序更新为:
class << self def instance_method_already_implemented?(method_name) return true if method_name == 'attribute?' super end end
也许您可以使用alias_attribute,从而使用具有不同名称的方法。