4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Railsでいいね順に投稿を並べる(ランキング)

Posted at

##概要
ネットで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)

##解説…?

  1. Questionモデルにleft_outer_joins(:likes)でlikesテーブルを外部結合する
     joinsメソッドを使った内部結合だといいねされていないQuestionが除外されるため外部結合を使う。

  2. 1で結合したテーブルをquestions.idでグループ化する
      いいねされている対象のQuestionが同じ同士でグループ化する

  3. select文で返すデータを指定(questionテーブルの全てとlikes_count)

  4. distinctで重複したデータを取り除く。

  5. ここ重要! reorderメソッドでlikes_countが多い順に並べ替える
    orderメソッドだとQuestionsテーブルのデフォルトの並び順(新規登録順)が適用されてしまうため
    reorderメソッドで並び順を書き換える

6.(ここはお好みで)limitメソッドでデータの取得件数を100件に絞る

##最後に
正直曖昧な理解が多くなんとかこぎつけた実装なので間違っていたり効率が悪いかもしれません。。
それとなく教えてくださると幸いです。。

この辺りのActiveRecordのクエリインターフェースに関してはRailsガイドがとてもわかりやすく載っているので
是非参考に

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?