如何在具有名为“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创建xx=x? 方法。 因此,请将此修复程序更新为:

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

也许您可以使用alias_attribute,从而使用具有不同名称的方法。