Ich habe es implementiert, indem ich mit Gem ** ransack ** in der Flima-App aus mehreren Spalten gesucht habe.
Wenn der Titel des Produkts oder der Text ein Schlüsselwort enthält und die angegebenen Bedingungen erfüllt sind, wird das Produkt getroffen. Die Ansicht der Suchleiste ist unten.
Die Tabelle ist übrigens wie folgt.
Kategorie ... Genre Produktstatus ... Status Versandkosten ... tragen Tage bis zum Versand ... Tag Preis ... Preis
ist. "Kategorie", "Produktstatus", "Versandkosten" und "Versandtage" werden in der Tabelle nur anhand der ID mit ActiveHash gespeichert. Ich möchte eine Suche durchführen, die die Elemente eingrenzen kann, die alle oben genannten Elemente + Schlüsselwörter (Produkttitel oder Textinhalt) treffen.
item_controller
class ItemsController < ApplicationController
# index,show,Da der Suchfenster-Header auf der Suchseite festgelegt ist, wird er zum Zeitpunkt dieser Aktion ausgeführt.
before_action :search_product, only: [:index, :show, :search]
#Kürzung
private
def search_product
@p = Item.ransack(params[:q]) #Suchobjekt generieren
@results = @p.result
end
end
: q in (params [: q]) ist der Standardparameterschlüssel für Suchparameter.
Das Folgende ist synonym, aber Sie können die Standard-Ransack-Methode verwenden, wenn die Suche bereits an anderer Stelle definiert ist.
Item.ransack(params[:q])
Item.search(params[:q])
@ p = Item.ransack (params [: q])
Nachdem Sie das Suchobjekt hier erstellt haben,
Ich habe die Suchergebnisse in @results mit @ results = @ p.result
eingefügt.
Suchansicht
# @Geben Sie die Suchinformationen in p ein und übergeben Sie sie an die Steuerung.
<%= search_form_for @p, url: search_items_path do |f| %>
<div class = 'nav-up'>
# :title_or_text_cont ist Text_Beschreibung, ob die in das Feld eingegebenen Zeichen im Titel oder im Text enthalten sind
<%= f.text_field :title_or_text_cont, placeholder: "Über Schlüsselwort suchen", 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, 'Kategorie', class: 'label' %>
<%= f.collection_select :genre_id_eq, Genre.where.not(id: 0), :id, :name, include_blank: 'nicht spezifiziert', class: 'search-select' %>
</div>
<div class='label-select'>
<%= f.label :status_id_eq, 'Produktzustand', class: 'label' %>
<%= f.collection_select :status_id_eq, Status.where.not(id: 0), :id, :name, include_blank: 'nicht spezifiziert', class: 'search-select' %>
</div>
<div class='label-select'>
<%= f.label :bear_id_eq, 'Versandkosten', class: 'label' %>
<%= f.collection_select :bear_id_eq, Bear.where.not(id: 0), :id, :name, include_blank: 'nicht spezifiziert', class: 'search-select' %>
</div>
<div class='label-select'>
<%= f.label :day_id_eq, 'Tage bis zum Versand', class: 'label' %>
<%= f.collection_select :day_id_eq, Day.where.not(id: 0), :id, :name, include_blank: 'nicht spezifiziert', class: 'search-select' %>
</div>
<div class='label-select'>
<%= f.label :price, 'Preis', class: 'label' %>
<%= f.radio_button :price_lteq, '' %>
nicht spezifiziert
<%= f.radio_button :price_lteq, '1000' %>
1000 Yen oder weniger
<%= f.radio_button :price_lteq, '2500' %>
2500 Yen oder weniger
<%= f.radio_button :price_lteq, '5000' %>
5000 Yen oder weniger
<br>
</div>
</div>
<% end %>
ruby: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>Es gibt kein passendes Produkt. Lassen Sie uns suchen, indem wir die Bedingungen ändern!</p>
</div>
<ul class='item-lists'>
<% Item.all.each do |item| %>
<%= render partial: "shared/item", locals: {item: item} %>
<% end %>
</ul>
<% end %>
Mit den oben genannten Informationen können Sie die Produkte eingrenzen, die den Suchergebnissen entsprechen. Ich werde zu einem späteren Zeitpunkt eine ausführliche Erklärung geben.
Recommended Posts