2011-10-10 12 views
12

私たちのfreeradiusサーバーで使用されている既存のデータベースに接続する必要があります。 1つのテーブルには、アクセスしようとしているattributeというカラムがあります。アクセスするときActiveRecord :: DangerousAttributeError

、私は彼のエラーを取得:

def self.default_scope 
    Radcheck.select("attribute as newattribute") 
end 

しかし、それはどちらか動作していないです:

ActiveRecord::DangerousAttributeError 
attribute? is defined by ActiveRecord 

を私は私のモデルでは、この列を選択し、名前を変更しようとしました。

誰もこれを回避する方法をお勧めしますか?私は本当にレールの列の名前を変更したい!

答えて

2

私はそのような状況に遭遇したことがないが、私は、これは

class Radcheck < ActiveRecord::Base 
    default_scope :select=> 'attribute as newattribute' 
end 

を動作するはずですまた、あなたは同様に、インスタンスメソッドを使用するオプションを持っているインスタンスメソッドdefault_scopeないクラス1

を使うべきだと思う:

RadCheck.read_attribute :attribute 

は、Si上に

+0

感謝としてビューを使用 - 私はこれを試してみたと私はまだブラストエラーが出ます。コントローラーの操作も変更する必要がありますか?現在、私はこれを持っています:@ radcheck = Radcheck.allありがとう –

+0

AR4で動作しませんでした –

10

を役に立てば幸いちょうどあなたのGemfile

gem 'safe_attributes' 

を追加し、宝石はすべての衝突の名前の世話をしようとするのRails 3.0でのActiveRecordによって予約されているどの属性が気にすることなく、https://stackoverflow.com/a/9106597/1266906

:milar質問私はこの答えを見つけました自動的に。

他の回答と同じように、あなたは、内部で予約された名前でフィールドにアクセスするためにRadcheck[:attribute]またはRadcheck.read_attribute :attribute/Radcheck.write_attribute :attribute, 'value'を使用する必要がありますが、宝石はvalidates_presence_of :attributeのような検証がいつものように動作が保証されます。

更なる詳細は、ここでhttps://github.com/bjones/safe_attributes

+1

私は、レガシーデータベースで有効な属性で同じ問題を遭遇しました。 "safe_attributes"を使うと、すぐに使えました。 – dhenze

+2

Google社員向けのメモ:この宝石は、 'attribute'のための*を除く*予約語のほとんどすべてに対して機能します。 readmeから: "ActiveRecordを使用する場合、あなたのスキーマに '属性'という名前の列を持つことは事実上不可能です。 –

+0

Hirbも使用している場合は、Hirb.disableを使用してモデル列をコンソールに表示する前に、無効にする必要があります。 –

0

でご利用いただけます外部データベースへの変更を必要としない解決策ですが、それは非常にマイナーな変更である、と言っても `attribute`任意の列名を使用して動作します。宝石は必要ありません。

外部/レガシーデータベースに、問題のある列の名前を変更するビューを作成します。例えば

ここ
CREATE VIEW radcheck_view AS (
    SELECT id, username, op, value, attribute rad_attribute 
    FROM radcheck 
); 

列がrad_attributeattributeと改名されている問題。

ビューに適切な権限を与えることを忘れないでください。私の場合、読み取り専用で使用:

GRANT SHOW VIEW ON radius.radcheck_view TO <rails_user> IDENTIFIED BY '<password>'; 

次に、あなたのレールモデルにtable_name

class RadiusRadcheck < RadiusExternal 
    self.table_name = 'radcheck_view' 
end