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

时间:2009-10-02 17:28:07

标签: ruby-on-rails activerecord informix

我正在访问一个我无法更改的数据库,并且它定义了一个名为 valid 的列。无论何时我尝试访问属性,我都会遇到此异常:

  

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

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

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

  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)

提前致谢!

4 个答案:

答案 0 :(得分:11)

试试这个:

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 mailing list

上找到了它

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

答案 1 :(得分:4)

使用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

答案 2 :(得分:3)

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

gem 'safe_attributes'

http://goo.gl/OO2H7

答案 3 :(得分:2)

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

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