2009-08-20 6 views
0

"valid"という名前の列を含むテーブルがあります。これはRails 2にアップデートした後に問題を引き起こしています。ActiveRecordは "def valid?"検証を行い、データベースからブール値を返さない。Rails 2.xでは、「有効な」列の表をどのように扱うのですか?

この問題を回避するにはどうすればよいですか?カラム名を私の唯一のオプションに変更していますか?

答えて

2

をテストするためにrow.val?を使用することができます

def val? 
    query_attribute('valid') 
end 

さて、あなたがすることができるものがありますが、私は、彼らは「ことを示唆するつもりです弾丸を噛んで列の名前を変更するよりも長期的にはもっと問題になるだろう。

データベースが他のアプリに開かれていない場合、それは - そうあなただけの何をするにしてもある程度苦しむするつもりだ...

なぜ名前を変更? Railsから得られる最大の利点の1つは、設定よりも慣例です。もしあなたがそうするならば、 "魔法"。 (実際には悪いことだと言われる人もいますが、これと一緒に行く人もいます)。 "valid"という名前の列を保持している場合は、モデルを一貫性のないものにします。これは、他のものとは異なる動作をする必要があり、それは悪いことです。または、Monkey-patch ActiveRecord :: Baseをおそらく使用することができます。そうすれば、すべてのモデルが同じように動作しますが、あなたのアプリはもうコンベンションに従わなくなります。

個人的な経験から: "user_id"という名前の列を作成しました。これは、慣習的にActiveRecordが(「_id」で終わるものと同じように)外部キーを考慮したものです。私はそれを覚えていますが、今は間違いだと思います。予定リストの別の項目...

これは必ずしもRailsの慣行に反して間違っているわけではありません。あなたがそうすることができ、十分に文書化されている場所がたくさんあります。 ActiveRecord側では、多くの場合、従来のデータベーススキーマへの接続の難しさを軽減するように設計されています。あなたが明らかにしているように、長所と短所をよく見て、あなたの選択肢を測ります。

+0

私は最初のレールアプリでこれを行いました。私は "image"という名前の列(あるいは多分テーブルだった)を持っていたので、なぜ私のアプリが破棄されたのか分かり次第、名前を変更しました。 –

+1

同意し、列の名前を変更します。これは、長期的には混乱を少なくします。 "model.valid"が表示されたら、Railsの検証(この場合のような属性ではありません)と関係があると思います。 – ryanb

+0

私は同意します。しかし、私は扶養家族と一緒に変更をスケジュールするまで、私のハックを使用しています。 –

1

私は私のモデルに以下を追加することにより、クラッシュを防ぐことができますが、それは完全に満足できるものではないのです。

class << self 
    def instance_method_already_implemented?(method_name) 
    return true if method_name == 'valid?' 
    super 
    end 
end 
+0

これは実際に私を助けました。私は 'method_name.include? '属性'と呼びます。なぜなら、レガシーDBの列の1つが処理されていたため、属性に名前が付けられていたからです。主要なPITAですが、今のところ... –

0

あなたのモデル内の列を参照する必要がありますか?そうでない場合、オーバーライドのActiveRecord :: Base.columnsは、トリックを行います...

def self.columns 
    super.delete_if {|c| c.name == 'valid' } 
end 
0

あなたは[]の表記を通じて属性にアクセスすることができます:あなた場合は、DangerousAttributeErrorを取得します

row[:valid] = "foo" 

このようにオブジェクトを初期化しよう:

row = MyModel.new :valid => "foo" 

ことを防ぐために、あなたはこのように、有効な属性のためのセッターを定義することができます。

def valid=(x) 
    self[:valid] = x 
end 

有効ですか?メソッドは行の検証に使用されます。 valのような別の質問方法を定義できますか?ブール値で取得するには、次のように:他のドキュメントとして、あなたはブール

関連する問題