##概要
ネットでrailsのいいねランキングを探すとjoinを使った内部結合でいいねが1つ以上ある投稿をランキングする記事は見つかったがいいねが0のものを含めたランキングの記事が見つからず、
頑張って実装したので理解度を深める意味で殴り書きします。
##前提
Questionモデル(投稿)
Likeモデル(いいね)
##実装
※長くてごめんなさい
@questions= Question.left_outer_joins(:likes).group('questions.id').select('questions.*, COUNT(likes.*) AS likes_count').distinct.reorder(likes_count: :desc).limit(100)
##解説…?
-
Questionモデルにleft_outer_joins(:likes)でlikesテーブルを外部結合する
joinsメソッドを使った内部結合だといいねされていないQuestionが除外されるため外部結合を使う。 -
1で結合したテーブルをquestions.idでグループ化する
いいねされている対象のQuestionが同じ同士でグループ化する -
select文で返すデータを指定(questionテーブルの全てとlikes_count)
-
distinctで重複したデータを取り除く。
-
ここ重要! reorderメソッドでlikes_countが多い順に並べ替える
orderメソッドだとQuestionsテーブルのデフォルトの並び順(新規登録順)が適用されてしまうため
reorderメソッドで並び順を書き換える
6.(ここはお好みで)limitメソッドでデータの取得件数を100件に絞る
##最後に
正直曖昧な理解が多くなんとかこぎつけた実装なので間違っていたり効率が悪いかもしれません。。
それとなく教えてくださると幸いです。。
この辺りのActiveRecordのクエリインターフェースに関してはRailsガイドがとてもわかりやすく載っているので
是非参考に