2017-02-21 15 views
0

熱心な負荷を実行したいが、熱心な負荷クエリでwhere句を使用したい。Eager Load Active Record Association with WHERE where Join句

のは、以下の我々が持っているとしましょう:機能は、機能のオーバーライドで上書きすることができactive属性を持ってい

class Features < ActiveRecord::Base 
    has_many :feature_overrides 
end 

class FeatureOverride < ActiveRecord::Base 
    belongs_to :feature 
end 

機能の上書きがユーザーに追加されるため、機能のactive属性は、特定のユーザーの機能の上書きによって上書きできます。私はまだ与えられたユーザのための機能のオーバーライドが存在するかどうかを確認するためにfeature_overridesを検索する必要があると思います。このクエリでは

Features.all.includes(:feature_overrides) 

:ここ

は、私はすべての機能と熱心な負荷feature_overridesを取得する必要がありますクエリです。熱心な負荷にどこを追加すると、私が欲しいものを私に与えていない:

Features.all.includes(:feature_overrides).where('feature_overrides.username = ?', username) 

これはのみusernameのオーバーライドが存在する特徴を含むように私の結果を削減します。

この時点で、私は左外部結合を行うことを望んでいると思いますが、そのアクティブなレコードを試しても、機能の上書き結合は逆直列化されません。

私は何とかクエリを実行するために熱心な負荷が欲しい:あなたはLEFT OUTERは(あなたが質問に書いた、まさに、私の心は知らされていなかった)参加必要があるよう

SELECT `features`.* FROM `features` 
SELECT `feature_overrides`.* FROM `feature_overrides` WHERE `feature_overrides`.`feature_id` IN (...) AND `feature_overrides`.`username` = ? 
+0

ユーザが上書きした機能が必要な場合は、「FeatureOverride.where(username:username).includes(:feature)」のようにすることができます。 – Psylone

+0

あなたの答えをありがとう!私は実際に機能をもう少し使っていますが、FeatureOverride.where(username:username).includes(:feature).featuresを実行することでそれらのクエリを取得できると思いますが、私の状況はそれより少し複雑です... – superJustin

+0

もう一つの方法は、 'join 'ActiveRecordメソッドを使うことです。おそらく、次のようなことができます: 'Feature.joins(:feature_overrides).where( 'feature_overrides.username =?'、username)'。 – Psylone

答えて

0

は、だからそれは音です。あなたはRailsの4にしている場合は、手動でこれを記述する必要があります

Feature.left_outer_joins(:feature_overrides) 

Feature.joins(%[LEFT OUTER JOIN 'feature_overrides' ON 'feature_overrides'.'feature_id' = 'features'.'id']) 

あなたはまた、追加することができますが、Railsの上なら5は、これを使用してみてくださいwhereスコープfeature_overridesをフィルタリングする必要がある場合はusernameとなります。