14

我正在访问一个我无法更改的数据库,并且它定义了一个名为valid的列。每当我尝试访问属性时,都会出现以下异常:

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

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

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

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

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

  • 视窗红宝石 1.8.6
  • Linux 服务器上的 Informix 数据库
  • 活动记录(2.3.4)
  • activerecord-informix-适配器 (1.0.0.9250)
  • 红宝石信息(0.7.1)

提前致谢!

4

4 回答 4

11

试试这个:

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

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

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

如果您愿意,您还可以查看datamapper,它可以更理智地处理这些事情。

于 2009-10-04T04:14:14.690 回答
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
于 2012-02-02T03:02:49.170 回答
3

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

gem 'safe_attributes'

http://goo.gl/OO2H7

于 2012-12-07T11:05:34.407 回答
2

对于读取,您可以使用 SQL 的 select-as 语句。不确定以下是否可行,但默认范围可能会使这很容易实现。

class MyRecord < ActiveRecord::Base
    default_scope :select=> 'valid as valid_column'
end
于 2009-10-02T17:44:16.810 回答