2009-10-02 5 views
14

私は変更できないデータベースにアクセスしており、有効な列はと定義されています。アトリビュートにアクセスしようとすると、この例外が発生します。「有効」という名前の列を持つデータベースでActiveRecordを使用するにはどうすればよいですか? (DangerousAttributeError)

有効ですか? ActiveRecordの (ActiveRecordは:: DangerousAttributeError)

によって定義された例外は、理にかなって、私はデータベースを変更することはできませんよ以来、どのように私はこのエラーを回避することができますか?

属性を「オーバーライド」しようとしましたが、元の列を削除する方法がわかりません。私は正常にこのvalid_columnメソッドを呼び出すことができますが、私はデータベースに定義されている別の属性にアクセスしようとすると、私は同じ例外が発生します。それでも、有効な列をマップしようとしているようです。

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

私はそれが重要なのかどうかわからないんだけど、ここで私の環境の詳細は以下のとおりです。

  • WindowsのRubyのLinuxサーバ
  • ActiveRecordの上1.8.6
  • Informixデータベース( 2.3.4)
  • activerecord-informix-adapter(1.0.0.9250)
  • ruby​​-informix(0.7.1)

ありがとうございます!

答えて

11

これを試してみてください:

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

それはハックだし、それはレール3に動作しない場合がありますが、それは今の問題を解決することができます。

私はあなたが望んでいた場合、あなたも幾分sanely物事のこれらの並べ替えを処理する、datamapperで見ることができるruby on rails mailing list

にそれを発見しました。

+1

有効なMETHOD_NAME ==「== METHOD_NAME場合valid''は 'trueを返すには '場合はどうなりますか?''それが仕事を得るためにはtrueを返す '変更する必要があります。やった。 –

+0

レール3に疑問符が必要なようです。 – Kelvin

3

読み取りの場合、SQLのselect-asステートメントを使用できる場合があります。次のことがうまくいくかどうかは不明ですが、デフォルトのスコープでこれを簡単に行うことができます。

class MyRecord < ActiveRecord::Base 
    default_scope :select=> 'valid as valid_column' 
end 
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 
3

のActiveRecordの予約済みの属性を気にせず、自分のgemfileに宝石を追加し、宝石が自動的に名前の衝突の世話をします。

gem 'safe_attributes' 

http://goo.gl/OO2H7

+0

オブジェクトがすでに作成されている場合はどうなりますか? myobj.associationにアクセスしようとすると、オブジェクトにエラーが発生します。オブジェクトは、gemfileにgemを追加する前に作成されました。ありがとう。 – daveomcd

関連する問題