のぶLab.

流しのソフトウェアエンジニアの雑記帳. Android, Scala, Clojure, Ruby on Railsなど

scopeでmodelにDBアクセス責務を移譲

RailsではModel.where()を使っていろいろな場所で同条件のクエリを発行することが可能だが、 修正が必要になった際に複数箇所修正が必要になったり、DRYの理念に則っていない。

これらをうまく解消するために、scopeという機能を使ってクエリ発行の責務をmodelに任せる

scopeを定義

class User < ActiveRecord::Base
  scope :activated, -> { where(activated: true)}
end

呼び出し方

User.activated

これでscopeに記述した条件のクエリが発行される。

また呼び出し例からわかる通り、where()で条件を記述するよりも scopeで文脈を示す方が何のデータを取得しているのか理解しやすくなる。

scopeを使うとDRYに則した実装になるだけでなく、可読性の向上も期待できる。