How can I use ActiveRecord on a database that has a column named 'valid'? (DangerousAttributeError)

风格不统一 提交于 2019-11-27 04:38:04

问题


I am accessing a database that I can't change and it has a column named valid defined. Anytime I try to access an attribute, I get this exception:

valid? is defined by ActiveRecord (ActiveRecord::DangerousAttributeError)

The exception makes sense, but since I'm not able to change the database, how can I get around this error?

I tried "overriding" the attribute, but I don't know how to remove the original column. I can successfully call this valid_column method, but any time I try to access another attribute defined in the database, I get the same exception. It still seems to be trying to map the valid column.

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

I'm not sure if it matters, but here are the details of my environment:

  • Windows Ruby 1.8.6
  • Informix database on a Linux server
  • activerecord (2.3.4)
  • activerecord-informix-adapter (1.0.0.9250)
  • ruby-informix (0.7.1)

Thanks in advance!


回答1:


Try this:

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

It's a hack, and it might not work in rails 3, but it could fix the problem for now.

I found it on the ruby on rails mailing list

If you wanted, you could also look at datamapper, which handles these sort of things somewhat more sanely.




回答2:


Use safe_attributes - https://github.com/bjones/safe_attributes . It works perfectly out of the box:

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



回答3:


Without worrying about ActiveRecord's reserved attributes, just add a gem in your gemfile and the gem will take care of name collisions automatically.

gem 'safe_attributes'

http://goo.gl/OO2H7




回答4:


For reads you might be able to use SQL's select-as statement. Not sure if the following will work, but a default scope may make this easily do-able.

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


来源:https://stackoverflow.com/questions/1510875/how-can-i-use-activerecord-on-a-database-that-has-a-column-named-valid-dange

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!