冗長な検索ロジックはscopeにしちゃおう

こんにちは!kossyです!



さて、今回はRailsで独自にモデルのデータの絞り込みを定義できるscopeについて、
ブログに残してみたいと思います。




環境
Rails 5.1.6
Ruby 2.5.1
MacOS Mojave




実装方法



例えば、「公開が終了した映画の中で原作が漫画でないデータをidが古い順に取りたい」をモデルから絞り込みをするとします。
これをコードに落とし込むと、

@movies = Movie.where(status: :end).where_not(original_work: :comic).order(id)

ってな感じになるかと思うのですが、これをscopeで定義できまして、

class Movie < ApplicationRecord
  scope :not_comic_end_movie, -> { where(status: :end).where_not(original_work: :comic).order(id) } 
end

って感じで定義できます。scopeとして定義すると、

@movies = Movie.not_comic_end_movie

とするだけで、

  @movies = Movie.where(status: :end).where_not(original_work: :comic).order(id)

とした時と同じレコードを取得することができます。

同じような検索を何度も行うような時や、記述が冗長になってしまった時に有効な手段だと思います。