0

STI の状況で default_scope を回避するのに問題があります。default_scope が子クラスに存在したり、クエリ条件を上書きしたりするのを防ぐ方法はありますか?

class Parent < ActiveRecord::Base
  default_scope where(:type => ["Child", "OtherChild"])
  scope :flag, where(:flag => true)
end

class Child < Parent
end

class OtherChild < Parent
end

Parent.all => 正しい結果が生成され、すべての Child および OtherChild アイテムが返されます。システムにモデルがなくなった「RemovedChild」タイプのオブジェクトは返されません。

Child.all => 正しい結果、すべての子の結果を生成します。

Child.flag.all => 壊れています。flag = true のすべての Child の代わりに、Parent.flag.all と同じ結果を返し、Parent クラスから default_scope を追加して、Child クラスが追加する type = Child を置き換えます。

親テーブルには、デフォルトのスコープが解決しようとしていた現在利用可能なクラスに対応しないタイプのアイテムが含まれると想定する必要があります。ActiveRecord::SubclassNotFound のインスタンスをグローバルにキャッチして無視する方法があれば、それも同様に機能します。

4

1 に答える 1

1

スコープの解決と回避策を遅らせるために、スコープの代わりにクラス メソッドの定義に切り替えることができます。

class Parent < ActiveRecord::Base
  default_scope where(:type => ["Child", "OtherChild"])
  def self.flag
    where(:flag => true)
  end
end
于 2013-02-07T05:55:35.943 に答える