Hyurakuのエンジニア日誌

SE出身Webエンジニアのブログ

Scopeをつかってモデル内のメソッドを書ける方法 #12

railsのアプリケーションを作成したときにscopeの使い方を 学んだので、今回はscopeの使い方を振り返る。

1. scopeとは

railsのモデル内に記載するメソッドのこと。

2. もしもscopeを使わなかったら

今回はContactGroupの2つのモデルを用意する。
ContactGroupは一対多。
コードで表すと次のようになる。

class Contact < ApplicationRecord
  belongs_to :group
class Group < ApplicationRecord
  has_many :Contact

ここでgroup_idが存在するならDB検索し、存在しなければ全てのデータを返すメソッドを書いてみた。

def self.by_group(group_id)
 if group_id.present?
   where(group_id: group_id)
 else
   all
 end
end

3. scopeの使用例

scopeの書き方は次のとおりである。

scope :メソッド名, -> (引数) { メソッド内の処理(引数や引数に対する処理) 引数に対する条件文}

scopeを使用するとby_groupメソッドは次のように書くことができる。

scope :by_group, -> (group_id) { where(group_id: group_id) if group_id.present?}

4. 検索機能をscopeにしよう

contactのname検索のメソッドを書いてみる。 まずはscopeを使わない書き方。

def self.search(term)
  if term && !term.empty?
    where('name LIKE ?', "%#{term}%")
  else
    all
  end
end

次にscopeを使った書き方。

scope :search, -> (term) { where('LOWER(name) LIKE :term ,term:  "%#{term.downcase}%") if term.present? }

scopeを使うことでより短く、簡潔に書くことができる。