

現在、railsを利用し、Facebookのような投稿に対しユーザーが「いいね」を押すようなWEBアプリを作成しています。

テーブルとmodelは以下の3つで構成しています。

  * Post id[PK], user_id, text
  * User id[PK], name
  * Good id[PK], post_id, user_id

POSTの一覧ページにて、自分が「いいね」を押しているか判るようにしたいので、  
以下のようなSQLをクエリで発行したいのですが

> SELECT * FROM posts LEFT OUTER JOIN goods  
>  ON goods.post_id = posts.id AND goods.user_id = 3

現状の実装の

[code]

    @posts = Post.eager_load(:goods).where(goods: {user_id: 3})
    
[/code]

では、

> SELECT * FROM `posts`  
>  LEFT OUTER JOIN `goods` ON `goods`.`post_id` = `posts`.`id`  
>  WHERE `goods`.`user_id` = 3

となってしまい、思ったとおりのクエリが発行できません。

[code]

    @posts = Post.joins("LEFT OUTER JOIN goods ON posts.id = goods.post_id AND goods.user_id = 3")
    
[/code]

とすれば、発行自体は出来るのですが、今度はキャッシュが聞かない為、viewでクエリが別途発行され、あまり良い方法ではないなと感じています。

eager_loadにjoinsのような条件を渡せれば良いのですが、そういった方法はありませんか？  
また、relationの張り方を工夫すれば問題ないなどという事であればご教示お願いします。

よろしくお願いします。


CC BY-SA 3.0
2016-03-04T15:14:14.353
22812
2020-02-09T13:02:55.403
14651
question
ruby-on-rails
railsでのeager_loadの結合条件の追加はできますか？


(コメントより)

rails のバージョンによっては、美しくはありませんが、

[code]

    Post.eager_load(:goods).joins("AND goods.user_id = 3").to_sql
    
[/code]

でも行ける気がします。


CC BY-SA 4.0
2018-07-08T09:53:34.513
45421
2018-07-08T09:53:34.513
754
22812
answer