0


0

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

どうすればこの問題を回避できますか? 列の名前変更は私の唯一の選択肢ですか?

4 Answer


2


他の場所で文書化されているように、あなたがすることができることがあります、しかし私は彼らがおそらく弾丸をかみ砕くこととコラムを改名することより長い目で見ればもっと問題になるだろうことを提案するつもりです。

あなたのデータベースが他のアプリケーションに開かれていないのであれば、それはそうです。

なぜ名前を変更するのですか? Railsから得られる最大の利点の1つは、設定に対する規約です。 あなたがそうするならば、「魔法」。 (それは実際に悪いことだと言う人もいますが、私と一緒に行ってください)。 "valid"という名前の列を保持していると、モデルの一貫性が損なわれることになります。これは他のモデルとは異なる動作をする必要があり、それは悪いことです。 あるいは、ActiveRecord

Baseにモンキーパッチを適用して、すべてのモデルが同じように動作するようにしても、アプリが規約に従わなくなる可能性があります。

個人的な経験から:私はActiveRecordが慣習的に外部キーと見なした "user_id"というカラムを作成しました( "_id"で終わるものはすべてそうです)。 私はその周りをコーディングしましたが、今はそれは間違いだと思います。 やることリスト上の別の項目…​

Railsの規約に反することは必ずしも間違っているわけではありません。そうすることができる場所はたくさんあり、それらはよく文書化されています。 ActiveRecord側では、例えば、多くがレガシーデータベーススキーマへの接続の困難さを減らすように特に設計されています。 あなたが明らかにやっているように、長所と短所をよく見て、そしてあなたのオプションを比較検討してください。


1


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

class << self def instance_method_already_implemented?(method_name)は、method_name == 'valid?'の場合にtrueを返します。スーパーエンド


0


モデルの列を見る必要がありますか? そうでなければ、ActiveRecord

Base.columnsをオーバーライドするとうまくいくでしょう…​

def self.columns super.delete_if {| c | c.name == '有効'}終わり


0


[]表記を使って属性にアクセスできます。

row [:valid] = "foo"

このようなオブジェクトを初期化しようとすると、DangerousAttributeErrorが発生します。

row = MyModel.new:有効=> "foo"

これを防ぐために、次のように属性セッターをvalidに定義することができます。

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

有効ですか? メソッドはまだ行検証用です。 あなたはvalのような異なる質問方法を定義できますか 次のようにブール値を取得します。

デフバル? query_attribute( 'valid')終了

これで、 `row.val?`を使ってブール値をテストできます。