こんにちは!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)
とした時と同じレコードを取得することができます。
同じような検索を何度も行うような時や、記述が冗長になってしまった時に有効な手段だと思います。