はじめに
最近までwhereやorderはついついcontrollerに書いてしまうことが多かったのですが、modelで定義した方がメリットが多いので今回はmodelにスコープを定義するやり方を解説していきます!
modelに定義するメリット
- controllerをみやすくシンプルにできる(Controllerを太らせないことが脱初心者への第一歩です!)
- modelに書くことによりテストが書きやすくなる!(RailsでいうとRspecのmodel_specでテストがかけますね!)
modelのスコープって何?
modelのスコープとは複数のクエリをまとめたメソッドのことです!!
where, order, join, limit, distinct ...etc
などでまとめることですね!
さっそくやってみる
今回は予約テーブルのreservationsコントローラーを設定しています
reservaiontsテーブル
title(string)とstart_time(datetime)のカラムがあります。
reservations.controller.rb
class ReservationsController < ApplicationController
def index
#ページネーションをつかっています(Reservation.allだと思ってください)
@reservations = Reservation.paginate(page: params[:page])
#全ての予約からstart_timeが今日より後の予約を 降順で表示する
@reservations_index = @reservations.where("start_time > ?", Date.today).order(start_time: :desc)
end
ご覧の通り少しコントローラーが長くなり読みづらいです。
これをmodelに定義してみます。
reservation.rb
class Reservation < ApplicationRecord
scope :future_reservations, -> { where("start_time > ?", Date.today).order(start_time: :desc) }
解説するとscopeでまず定義しひとまずfuture_reservationsでメソッドを定義します。
その後はcontrollerの記述をリファクタリングするだけです!!
ちなみに
reservation.rb
scope :future_reservations, -> do
where("start_time > ?", Date.today).order(start_time: :desc)
end
コードが長くなる場合はこちらの方が綺麗なので覚えておきましょう!!
reservations.controller.rb
def index
@reservations = Reservation.paginate(page: params[:page])
@reservations_index = @reservations.future_reservations
end
最後にcontrollerにメソッドを書いてすっきりさせましょう!
お疲れ様でした!!!