Giba

ジバブログ - Webエンジニアリングとマーケティング

Ruby on Railsで「いいね」機能の実装で自分自身の記事に「いいね」するとカウントされない(一応解決したが。。。)

Rails4.1で簡易SNSを構築中。「いいね」機能を実装する中で、次の記事とほぼ同じモデル構成になった。

※ ただし、私の場合はユーザーが自分の記事に対しても「いいね」がつけられるようにしたかった。

Rails3.2でスター機能実装 - Qiita

余談だが

user -> post の関係を複数作る場合、別の名前(:stared_users)を付け、sourceオプションで本当の名前を指定するらしい。

というのは上記の記事で知った。素敵な機能である。

さて本題だが、「いいね」数のカウントでユーザー自身の分がカウントされていなかった。

試行錯誤すると、N+1問題を回避するためのincludesの順番を変更すると正常にカウントできた。

#修正前
@posts = Post.includes(:user).includes(:stared_users).references(:user)
#修正後
@posts = Post.includes(:stared_users).includes(:user).references(:user)

……と、一応期待通りの動きになったのだが、修正前と修正後のSQLを見てもLEFT OUTER JOINするテーブルの順番が違うだけなので出てくる結果は同じように思えて、違いが生まれる理由がわからない。Railsは奥が深い。

※ 余談をあとひとつ。もう少し試行錯誤してみると、referencesを外しても期待通りの動きになった。ただしこの場合はSQLは外部結合一発でデータ取得するものではなく、IN演算子を数回使うものだった。