4

パラノイアの宝石を使用して、レコードを「ソフト削除」しています。ここで、関連付けられたモデルに対して、これらのレコード (一部は削除されている可能性があります) を熱心にロードする必要があります。default_scopeパラノイアは、これを「パラノイド」モデルに追加します。

default_scope :conditions => { :deleted_at => nil }

したがって、実際には、これらの(単純化された)モデルがあります。

class Product
  has_many :orders
  default_scope :conditions => { :deleted_at => nil }
end

class Order
  belongs_to :product
end

私が達成しようとしているのは、注文にアクセスするときに製品を熱心にロードすることです:

Order.includes(:product)

これ ( Rails3 で関連付けられたリレーションでスコープ外を使用する方法から) は、ここでは機能しません。

Product.unscoped { Order.includes(:product) }

条件を追加belongs_toするためのカスタム関係を作成できることはわかっていますが(入れ子になった関連付けとスコープを Eager でロードする場合のように)、既存の関係を削除する方法を見つけることができません。

質問:既定のスコープが熱心な読み込みクエリに適用されないようにするにはどうすればよいですか?

4

2 に答える 2

2

さて、回避策は、「偏執狂」モデルで結合を強制することであることがわかりました。これにより、次のことが回避されますdefault_scope

Order.joins(:product).includes(:product)

きれいではありませんが、うまくいきます。可能であれば、より良い回答を希望します。

于 2012-11-11T22:02:22.120 に答える
1

このバグは Rails >= 4.1.8 で修正されています。

https://github.com/rails/rails/issues/11036

https://github.com/rails/rails/pull/17360

于 2015-07-23T21:27:15.253 に答える