[RUBY] [Rails] Suche aus mehreren Spalten + Bedingungen mit Gem und Ransack

Zusammenfassung der Suchbedingungen

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.

スクリーンショット 2020-11-10 11.33.46.png

Die Tabelle ist übrigens wie folgt.

スクリーンショット 2020-11-10 11.34.29.png

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.

Beschreibung des Controllers

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.

Beschreibung der Suchleiste

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 %>

Anzeigen, um Suchergebnisse anzuzeigen

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

[Rails] Suche aus mehreren Spalten + Bedingungen mit Gem und Ransack
Lassen Sie uns eine Suchfunktion mit Rails (Ransack) machen
[Rails] Funktion zum Suchen und Auflisten von Produkten aus mehrstufigen Kategorien
Verwenden Sie mit Rails 6.0 mehrere Datenbanken
Implementieren Sie eine verfeinerte Suchfunktion für mehrere Modelle ohne Rails5-Juwel.
Suchen und Ausführen einer Methode aus einer Instanz mit Verarbeitung (Java)
Hash-Tag-Suche wie Insta und Twitter in Rails implementiert (kein Juwel)
[Rails] Beachten Sie, dass beim Schreiben ein erweitertes Suchformular mit Ransack erstellt wurde
Zeitlose Suche mit Rails + JavaScript (jQuery)
[Rails 6] Registrieren und Anmelden mit Devise + SNS-Authentifizierung (mehrere Links zulässig)
[Schienen] Verwalten Sie mehrere Modelle mit einem Edelstein
[Rails] Profitieren Sie mit minimalem Aufwand von Rubocop
[Rails] Verwalten wir Konstanten mit config gem
[Rails] Buchsuche mit Amazon PA API