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 のインスタンスをグローバルにキャッチして無視する方法があれば、それも同様に機能します。