카테고리 없음

Ruby on Rails 조건에 따라 여러개(복수)의 where 작성

곽빵 2021. 11. 22. 16:40

개요

검색 쿼리를 작성하기에 있어서 다양한 검색조건이 올 수도 있고, 하나의 조건만 올 수도 있는 상황에서 

어떻게 검색처리를 할 것인가 를 해결하기 위해 model 의 scope를 이용한 글이다.

모델의 스코프란? 

스코프를 설정하는 것으로, 관련 오브젝트나 model의 method 호출하는 행위로써 참조되는 자주 사용되는 쿼리를 지정할 수 있으며, 스코프에서는 where, joins, includes 등 지금까지 등장한 모든 메서드를 사용할 수 있습니다. 어떤 스코프 method든 항상 ActiveRecord :: Relation객체를 반환합니다. 이 object에 대해서 다른 스코프를 포함하는 다른 메서드 호출을 할 수도 있습니다. (체인방식으로 연결 가능하다는 말) 단순한 스코프를 설정하려면 클래스의 내부에서 scope method를 사용해 스코프가 호출되었을 때에 실행해 주었으면 하는 쿼리를 거기서 건네줍니다.

 

공식문서에 써 있는것을 바탕으로하면 내가 원하는 쿼리를 특정한 조건일때마다 넣는것을 좀더 유연하게 가능할 뿐더러,

언제든지 재활용 할 수 있기때문에 다양한 쿼리의 조합을 만들어 낼 수 있다.

 

class Product < ApplicationRecord

  scope :search, -> (params) do
    return if params.blank? # 조건으로 들어온게 없을땐 pass
    
    # scope method를 이용하면 이렇게 체이닝 방식으로 가능하다.
    product_name_like(params[:product_name])
      .brand(params[:brand])
      .category(params[:category])
  end

  # scope :method_name, -> (param) { query condition }
  scope :product_name_like, -> (product_name) { where('pr_name LIKE ?', "%#{product_name}%") if product_name.present? }
  scope :brand, -> (brand) { where('pr_br_id =', brand) if brand.present? }
  scope :category, -> (category) { where('pr_ca_id =', category) if category.present? }
  
end

 

 

참고한 기사

 

https://qiita.com/ozin/items/24d1b220a002004a6351

 

Railsのモデルのscopeを理解しよう - Qiita

はじめに Railsを学習していて、「モデルのscopeってどうやって使うんだろう?」となったことがありました。Railsのモデルのscopeはどのような場面で、どうやって使うのかについて説明して行

qiita.com

https://qiita.com/poire_prog/items/48f569cdfc8000e18896

 

【Rails】複数の条件の検索機能を作る。日付範囲検索を行う - Qiita

やりたいこと 1つの検索フォームで、複数の値を同時に検索したい。 今回は、customersテーブルのname_kana、phoneとreservationsテーブルのcheck_inの日付範囲検索を1つの検索フォームで実装する...

qiita.com