RailsにおけるScope

scopeとはクラスメソッドを使う際、可読性を保つためにあるものである。
例えば、あるUserのidを降順にし、かつ5つだけ表示させたい場合、以下のようなメソッドを使うことになる。

User.order(id: desc).limit(5)

しかしながら、同じクエリ文が何回も出てくるとそのたびにこれを記述するのは面倒だし、わかりにくい。そこでそれを解決するためにscopeがある。

model

class User < ApplicationRecord
  scope :recent, -> { order(id: :desc).limit(5) }
end

controller

class UsersController < ApplicationController

def index
  @users = User.recent
end

これで繰り返しがなくなり、コントローラーでも使えるようになる。さらにscopeでは引数を渡すこともできる。以下の通り。

model

class User < ApplicationRecord
  scope :recent, -> (count) { order(id: :desc).limit(count) }
end

controller

class UsersController < ApplicationController

def index
  @users = User.recent(10)
end