LoginSignup
1
0

More than 3 years have passed since last update.

【脱初心者!!】Railsでmodelにスコープを定義する!

Posted at

はじめに

最近まで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にメソッドを書いてすっきりさせましょう!
お疲れ様でした!!!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0