2

私のデータベースでは、すべての外部キーを に設定しましたunsigned int not null default 0。その結果、私の Rails アプリでは、id=0 のオブジェクトに対するクエリが大量に発生します。次に例を示します。

class Foo < ActiveRecord::Base
  belongs_to :bar
end

class Bar < ActiveRecord::Base
end

コンソールで、これを行うと:

Foo.new.bar

次に、このクエリが実行されます。

SELECT `bars`.* FROM `bars` WHERE `bars`.`id` = 0 LIMIT 1

モンキー パッチを試してみましたが、method_missing はこの種の呼び出しをキャッチできないようです。スキーマを変更したくありません (現時点では変更できません)。これを回避できると思われる唯一の方法は、手動で常に bar_id != 0 をチェックすることですが、それはあまりきれいではないようです。

アイデア/提案?

明確にするために、スキーマを変更したくありません。問題は、0 と nil の両方が無効な ID と見なされるように ActiveRecord を構成/ハッキングして、id=0 のオブジェクトに対するクエリを防止できるかどうかです。

4

2 に答える 2

0

所属メソッドで条件を使用してみることができます。条件は、アクティブレコードクエリを通じて満たされなければならないデフォルトのwhere句を作成します。

belongs_to :bar, :conditions => "id != 0"
于 2012-08-22T22:05:21.817 に答える
0

とにかく移行ソリューションを投稿しています。あれば喜んで削除します

...この時点でスキーマを変更することはできません

が真であることが示されています。新しい移行ファイル:

def up
  change_column_default(:bars, :id, nil) # removes default, letting it be null
  execute "update bars set id = null where id = 0"
end

def down
  change_column_default(:bars, :id, 0)
  execute "update bars set id = 0 where id is null"
end
于 2012-08-22T20:57:21.417 に答える