【Rails】Gem, ransack에서 복수 컬럼+조건으로부터 검색한다
검색 조건 개요
프리마 앱에서 Gem ransack을 사용하여 여러 열에서 검색하는 방법으로 구현했습니다.
상품의 타이틀이나, 본문의 어느 쪽인가에 키워드가 있으면서 지정한 조건에 들어맞으면 있으면 상품이 히트합니다.
검색창의 보기는 다음과 같습니다.
덧붙여서 테이블은 다음과 같이 되어 있습니다.
카테고리 … genre
상품 상태 … status
우송료 부담 …
발송까지의 일수 … day
가격 … price
입니다. 「카테고리」, 「상품 상태」, 「송료 부담」, 「발송까지의 일수」는 ActiveHash를 이용해, 테이블에는 id만 보존하고 있습니다.
상기의 항목+키워드(상품의 타이틀인가, 텍스트의 내용) 모두에 히트한 것을 짜낸다고 하는 검색을 실행하고 싶습니다.
컨트롤러 설명
item_controllerclass ItemsController < ApplicationController
# index,show,searchページに検索窓のヘッダーを設置しているため、そのアクションの時に実行
before_action :search_product, only: [:index, :show, :search]
#省略
private
def search_product
@p = Item.ransack(params[:q]) # 検索オブジェクトを生成
@results = @p.result
end
end
(params[:q])의 :q는 검색 매개변수의 기본 매개변수 키입니다.
다음은 동의어이지만 이미 다른 위치에서 search를 정의한 경우 기본 ransack 메서드를 사용할 수 있습니다.Item.ransack(params[:q])
Item.search(params[:q])
@p = Item.ransack(params[:q])
여기서 검색 객체를 생성한 후,@results = @p.result
에서 검색 결과를 @results에 넣습니다.
검색 막대 설명
검색 보기# @pに検索の情報を入れて、コントローラーに渡します。
<%= search_form_for @p, url: search_items_path do |f| %>
<div class = 'nav-up'>
# :title_or_text_contは、text_fieldに入力した文字がtitleかtextの中に含まれているか、という記述
<%= f.text_field :title_or_text_cont, placeholder: "キーワードから探す", class: "input-box" %>
<button class="search-button">
<%= image_tag("search.png", class:"search-icon") %>
</button>
</div>
<div class='nav-down'>
<div class='label-select'>
<%= f.label :genre_id_eq, 'カテゴリー', class: 'label' %>
<%= f.collection_select :genre_id_eq, Genre.where.not(id: 0), :id, :name, include_blank: '指定なし', class: 'search-select' %>
</div>
<div class='label-select'>
<%= f.label :status_id_eq, '商品の状態', class: 'label' %>
<%= f.collection_select :status_id_eq, Status.where.not(id: 0), :id, :name, include_blank: '指定なし', class: 'search-select' %>
</div>
<div class='label-select'>
<%= f.label :bear_id_eq, '送料負担', class: 'label' %>
<%= f.collection_select :bear_id_eq, Bear.where.not(id: 0), :id, :name, include_blank: '指定なし', class: 'search-select' %>
</div>
<div class='label-select'>
<%= f.label :day_id_eq, '発送までの日数', class: 'label' %>
<%= f.collection_select :day_id_eq, Day.where.not(id: 0), :id, :name, include_blank: '指定なし', class: 'search-select' %>
</div>
<div class='label-select'>
<%= f.label :price, '価格', class: 'label' %>
<%= f.radio_button :price_lteq, '' %>
指定なし
<%= f.radio_button :price_lteq, '1000' %>
1000円以下
<%= f.radio_button :price_lteq, '2500' %>
2500円以下
<%= f.radio_button :price_lteq, '5000' %>
5000円以下
<br>
</div>
</div>
<% end %>
검색 결과를 표시하는 보기
search.html.erb<% if @results.present? %>
<ul class='item-lists'>
<% @results.each do |item| %>
<%= render partial: "shared/item", locals: {item: item} %>
<% end %>
</ul>
<% else %>
<div>
<p>一致する商品がありません。条件を変えて検索してみよう!</p>
</div>
<ul class='item-lists'>
<% Item.all.each do |item| %>
<%= render partial: "shared/item", locals: {item: item} %>
<% end %>
</ul>
<% end %>
이상으로 검색 결과에 있던 상품을 좁힐 수 있습니다.
자세한 해설은 나중에 하려고 합니다.
Reference
이 문제에 관하여(【Rails】Gem, ransack에서 복수 컬럼+조건으로부터 검색한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/zuu_aa/items/c2fa9622a56a8b52fe07
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
item_controller
class ItemsController < ApplicationController
# index,show,searchページに検索窓のヘッダーを設置しているため、そのアクションの時に実行
before_action :search_product, only: [:index, :show, :search]
#省略
private
def search_product
@p = Item.ransack(params[:q]) # 検索オブジェクトを生成
@results = @p.result
end
end
(params[:q])의 :q는 검색 매개변수의 기본 매개변수 키입니다.
다음은 동의어이지만 이미 다른 위치에서 search를 정의한 경우 기본 ransack 메서드를 사용할 수 있습니다.
Item.ransack(params[:q])
Item.search(params[:q])
@p = Item.ransack(params[:q])
여기서 검색 객체를 생성한 후,@results = @p.result
에서 검색 결과를 @results에 넣습니다.검색 막대 설명
검색 보기# @pに検索の情報を入れて、コントローラーに渡します。
<%= search_form_for @p, url: search_items_path do |f| %>
<div class = 'nav-up'>
# :title_or_text_contは、text_fieldに入力した文字がtitleかtextの中に含まれているか、という記述
<%= f.text_field :title_or_text_cont, placeholder: "キーワードから探す", class: "input-box" %>
<button class="search-button">
<%= image_tag("search.png", class:"search-icon") %>
</button>
</div>
<div class='nav-down'>
<div class='label-select'>
<%= f.label :genre_id_eq, 'カテゴリー', class: 'label' %>
<%= f.collection_select :genre_id_eq, Genre.where.not(id: 0), :id, :name, include_blank: '指定なし', class: 'search-select' %>
</div>
<div class='label-select'>
<%= f.label :status_id_eq, '商品の状態', class: 'label' %>
<%= f.collection_select :status_id_eq, Status.where.not(id: 0), :id, :name, include_blank: '指定なし', class: 'search-select' %>
</div>
<div class='label-select'>
<%= f.label :bear_id_eq, '送料負担', class: 'label' %>
<%= f.collection_select :bear_id_eq, Bear.where.not(id: 0), :id, :name, include_blank: '指定なし', class: 'search-select' %>
</div>
<div class='label-select'>
<%= f.label :day_id_eq, '発送までの日数', class: 'label' %>
<%= f.collection_select :day_id_eq, Day.where.not(id: 0), :id, :name, include_blank: '指定なし', class: 'search-select' %>
</div>
<div class='label-select'>
<%= f.label :price, '価格', class: 'label' %>
<%= f.radio_button :price_lteq, '' %>
指定なし
<%= f.radio_button :price_lteq, '1000' %>
1000円以下
<%= f.radio_button :price_lteq, '2500' %>
2500円以下
<%= f.radio_button :price_lteq, '5000' %>
5000円以下
<br>
</div>
</div>
<% end %>
검색 결과를 표시하는 보기
search.html.erb<% if @results.present? %>
<ul class='item-lists'>
<% @results.each do |item| %>
<%= render partial: "shared/item", locals: {item: item} %>
<% end %>
</ul>
<% else %>
<div>
<p>一致する商品がありません。条件を変えて検索してみよう!</p>
</div>
<ul class='item-lists'>
<% Item.all.each do |item| %>
<%= render partial: "shared/item", locals: {item: item} %>
<% end %>
</ul>
<% end %>
이상으로 검색 결과에 있던 상품을 좁힐 수 있습니다.
자세한 해설은 나중에 하려고 합니다.
Reference
이 문제에 관하여(【Rails】Gem, ransack에서 복수 컬럼+조건으로부터 검색한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/zuu_aa/items/c2fa9622a56a8b52fe07
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
# @pに検索の情報を入れて、コントローラーに渡します。
<%= search_form_for @p, url: search_items_path do |f| %>
<div class = 'nav-up'>
# :title_or_text_contは、text_fieldに入力した文字がtitleかtextの中に含まれているか、という記述
<%= f.text_field :title_or_text_cont, placeholder: "キーワードから探す", class: "input-box" %>
<button class="search-button">
<%= image_tag("search.png", class:"search-icon") %>
</button>
</div>
<div class='nav-down'>
<div class='label-select'>
<%= f.label :genre_id_eq, 'カテゴリー', class: 'label' %>
<%= f.collection_select :genre_id_eq, Genre.where.not(id: 0), :id, :name, include_blank: '指定なし', class: 'search-select' %>
</div>
<div class='label-select'>
<%= f.label :status_id_eq, '商品の状態', class: 'label' %>
<%= f.collection_select :status_id_eq, Status.where.not(id: 0), :id, :name, include_blank: '指定なし', class: 'search-select' %>
</div>
<div class='label-select'>
<%= f.label :bear_id_eq, '送料負担', class: 'label' %>
<%= f.collection_select :bear_id_eq, Bear.where.not(id: 0), :id, :name, include_blank: '指定なし', class: 'search-select' %>
</div>
<div class='label-select'>
<%= f.label :day_id_eq, '発送までの日数', class: 'label' %>
<%= f.collection_select :day_id_eq, Day.where.not(id: 0), :id, :name, include_blank: '指定なし', class: 'search-select' %>
</div>
<div class='label-select'>
<%= f.label :price, '価格', class: 'label' %>
<%= f.radio_button :price_lteq, '' %>
指定なし
<%= f.radio_button :price_lteq, '1000' %>
1000円以下
<%= f.radio_button :price_lteq, '2500' %>
2500円以下
<%= f.radio_button :price_lteq, '5000' %>
5000円以下
<br>
</div>
</div>
<% end %>
search.html.erb
<% if @results.present? %>
<ul class='item-lists'>
<% @results.each do |item| %>
<%= render partial: "shared/item", locals: {item: item} %>
<% end %>
</ul>
<% else %>
<div>
<p>一致する商品がありません。条件を変えて検索してみよう!</p>
</div>
<ul class='item-lists'>
<% Item.all.each do |item| %>
<%= render partial: "shared/item", locals: {item: item} %>
<% end %>
</ul>
<% end %>
이상으로 검색 결과에 있던 상품을 좁힐 수 있습니다.
자세한 해설은 나중에 하려고 합니다.
Reference
이 문제에 관하여(【Rails】Gem, ransack에서 복수 컬럼+조건으로부터 검색한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/zuu_aa/items/c2fa9622a56a8b52fe07텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)