3

Rails 5、filterrificを使用してアソシエーション属性の多相関連を持つモデルをフィルタリングします。仕事をするためにfilterifficRails 5はアソシエーションのアソシエーションを取得します

Flag 
    belongs_to :flaggable, polymorphic: true 
    belongs_to :reporter, class_name: "User" 

Post 
belongs_to :user 
has_many :flags, as: :flaggable 

Comment 
belongs_to :user 
has_many :flags, as: :flaggable 

、それがモデルに定義されたスコープを必要とする、と私は、特定のユーザーに属するすべてのフラグを立てポストやコメントを取得しようとしています。 flag.flaggable.user.idは正しく動作しますが、スコープを正しく取得できないようです。

scope :with_owner_name, lambda { |post_owner| 
    includes(flaggable: :user).where(:post => {:user => [*post_owner]}) 
    } 

または

scope :with_owner_name, lambda { |post_owner| 
     includes(flaggable: :user).where(:flaggable => {:user => [*post_owner]}) 
     } 

戻り

は熱心にポリモーフィックな関連読み込むことができません:

flaggableを、個別に同じ処理を行い、各flaggableモデルを含めるしようとしています。これを行う方法さえありますか?多相スコープに関するfilterrificのドキュメントでは何も見つかりません。代わりにFlagとPost/Commentユーザーとの関連付けを行う必要がありますか?

答えて

1

これは非常に特有の問題ではありません。多態性関係を扱うことは苦労することがあります。同様のケースがあり、最終的にこれを修正するため手動で結合したと思います。

これはうまくいきますか?

joins("INNER JOIN flags ON flags.flaggable_id = posts.id AND flags.flaggable_type = 'Post' INNER JOIN users ON users.id = flags.user_id") 

など。

scope :with_owner_name, lambda { |post_owner| 
    joins("INNER JOIN flags ON flags.flaggable_id = posts.id AND flags.flaggable_type = 'Post' INNER JOIN users ON users.id = flags.user_id").where(:post => {:user => [*post_owner]}) 
} 
関連する問題