[Rails]ransack에서 관련 모델 (부모 및 자식)의 열을 넘어서 검색하는 방법

실현하고 싶은 것



하나의 모델과 관련 (중첩)하는 모델의 열까지 검색 대상으로 만들고 싶습니다.

구체적으로는, 헌옷 가게의 점포명 뿐만이 아니라, 에리어명(1대다)이나 취급 브랜드명(다대다)까지 포함해 일괄 검색하고 싶다.



결론



양식 태그의 요소 이름에 関連するモデル名_関連するモデルのカラム名

관련 모델은 대 1 (belongs_to: hoge, 또는 has_one: fuga)



예를 들어, shop 모델에 묶는 area 모델의 영역 이름 (name)을 검색 조건으로 만들고 싶을 때= f.フォームヘルパー :要素名要素名area_name_cont 로 한다.

분해하면
area → 관련 모델명
name → 관련 모델의 열 이름
cont → 부분 일치를 지정하는 술어

됩니다.
= search_form_for(@q, url: shop_search_path) do |f|
  = f.text_field :area_name_cont
  # shopモデルに紐づくareaモデルの、エリア名(name)

관련 모델이 대다(has_many: hoges 등)



예를 들면, shop 모델에 묶는 brands 모델의 브랜드명(name)을 검색 조건으로 하고 싶을 때= f.フォームヘルパー :要素名要素名brands_name_cont 로 한다.

분해하면
brands → 관련 모델명 ※shop has_many: brands이므로 복수형
name → 관련 모델의 열 이름
cont → 부분 일치를 지정하는 술어

됩니다.
= search_form_for(@q, url: shop_search_path) do |f|
  = f.text_field :brands_name_or_genres_name_cont
  # shopモデルに紐づくbrandモデルの、ブランド名(name)
  # shopモデルに紐づくgenreモデルの、ジャンル名(name)
  # ※紐づくモデルが複数の時は、モデル名が複数形になることに注意

덧붙여서, _or_ 등으로 컬럼명을 연결하면, 복수컬럼을 검색 대상으로 할 수 있습니다.

실제의 ransack의 사용법 등에 대해서는 [Rails]ransack을 이용한 다양한 검색 폼 작성 방법 정리 등의 기사를 참고해 주세요.

모델 간의 연관



※관련되는 개소만 기재



shop.rb
# shopモデル
  belongs_to :area, optional: true
  has_many :shop_genres
  has_many :shop_brands
  has_many :genres, through: :shop_genres
  has_many :brands, through: :shop_brands

area.rb
# areaモデル
  has_many :shops

brand.rb
# brandモデル
  has_many :shop_brands
  has_many :shops, through: :shop_brands

shop_brand.rb
# shop_brandモデル
  belongs_to :shop
  belongs_to :brand

shop_genre.rb
# shop_genreモデル
  belongs_to :shop
  belongs_to :genre

관련을 조사하는 방법


ransackable_associations 라는 메소드를 사용하면 편리합니다.

1. 애플리케이션 디렉토리에서 rails c

terminal
# 該当のアプリケーションディレクトリで実行

$ rails c
Running via Spring preloader in process 61541
Loading development environment (Rails 5.0.7.2)
[1] pry(main)> 

2. モデル名.ransackable_associations 실행

terminal
# 今回はShopモデルとの関連を調べたいので、Shop.ransackable_associationsとすると
  Shopモデルに紐づくモデルが表示される
[1] pry(main)> Shop.ransackable_associations
=> ["user", "area", "shop_genres", "shop_brands", "genres", "brands"]
[2] pry(main)> 

참고



Ransack으로 쉽게 검색 양식 만들기 73 레시피 -026 관련
Ransack에서 상위 또는 하위 테이블의 열에서 여러 검색하는 방법

좋은 웹페이지 즐겨찾기