Rails / 記事数で並べ替える

Shunsuke Sawada

たまにアソシエーションされたモデルのレコード数が多い順に並べ替えたいことがある。
いろいろやり方はあるだろうけど、一番簡単なのはこれかな。
  

Userモデルにカウンター用のカラムをつくる

ruby
1
2
3
4
5
6
7
class AddPostsCountToUser < ActiveRecord::Migration
  def change
    add_column :users, :posts_count, :integer, default: 0
  end
end

  
  
Postレコードがつくられたら、Userのposts_counterを更新するように設定。

ruby
1
2
3
4
5
6
7
8
9
10
class User < ActiveRecord::Base
  has_many :posts
  scope :by_posts, order('posts_count DESC')
end

class Post < ActiveRecord::Base
  belongs_to :user, counter_cache: true
end

  
  
こんな感じでコントローラーで呼び出せばOK。

ruby
1
2
3
4
5
class AdminsController < ApplicationController
  def index
    @users = User.by_posts
  end
end

以上です。

3
Shunsuke Sawada

おすすめの記事

acts-as-taggable-on タグを表示させる順番を決めたい
Railsを4.2にバージョンアップしたら、Vagrantのローカル開発環境にアクセスできなくなった問題
Railsのバリデーションエラー後にレイアウトが崩れるとき