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

我正在访问一个我无法更改的数据库,它有一个名为valid defined的列。 无论何时我尝试访问属性,我都会遇到以下exception:

有效? 由ActiveRecord定义(ActiveRecord :: DangerousAttributeError)

exception是有道理的,但由于我无法更改数据库,如何解决此错误?

我尝试“覆盖”该属性,但我不知道如何删除原始列。 我可以成功调用这个valid_column方法,但是每当我尝试访问数据库中定义的另一个属性时,我都会得到相同的exception。 它似乎仍在尝试映射有效列。

def valid_column=(valid) write_attribute(:valid, valid) end def valid_column read_attribute(:valid) end 

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

  • Windows Ruby 1.8.6
  • Linux服务器上的Informix数据库
  • activerecord(2.3.4)
  • activerecord-informix-adapter(1.0.0.9250)
  • ruby-informix(0.7.1)

提前致谢!

试试这个:

 class MyTable < AR:Base class << self def instance_method_already_implemented?(method_name) return true if method_name == 'valid' super end end end 

这是一个黑客,它可能无法在rails 3中工作,但它现在可以解决问题。

我在ruby on rails邮件列表上找到了它

如果你愿意,你也可以看一下datamapper ,它可以更加理智地处理这些事情。

使用safe_attributes – https://github.com/bjones/safe_attributes 。 它开箱即用:

 class WebsiteUser < ActiveRecord::Base establish_connection 'cf_website' set_table_name 'nc_users' bad_attribute_names :hash end 

对于读取,您可以使用SQL的select-as语句。 不确定以下内容是否有效,但默认范围可能会使此操作变得容易。

 class MyRecord < ActiveRecord::Base default_scope :select=> 'valid as valid_column' end 

无需担心ActiveRecord的保留属性,只需在gemfile中添加一个gem,gem就会自动处理名称冲突。

 gem 'safe_attributes' 

http://goo.gl/OO2H7