[RUBY] [Rails] Recherche à partir de plusieurs colonnes + conditions avec Gem et ransack

Résumé des conditions de recherche

Je l'ai implémenté en recherchant dans plusieurs colonnes à l'aide de Gem ** ransack ** dans l'application Flima.

S'il y a un mot-clé dans le titre du produit ou dans le texte et que les conditions spécifiées sont remplies, le produit sera frappé. La vue de la barre de recherche est ci-dessous.

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

Au fait, le tableau est le suivant.

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

Catégorie ... genre Statut du produit ... statut Frais d'expédition ... ours Jours jusqu'à l'expédition ... jour Prix ... prix

est. «Catégorie», «État du produit», «Frais de port» et «Jours d'expédition» sont stockés dans le tableau uniquement par identifiant à l'aide d'ActiveHash. Je voudrais effectuer une recherche qui peut affiner les éléments qui touchent tous les éléments ci-dessus + mots-clés (titre du produit ou contenu textuel).

Description du contrôleur

item_controller


class ItemsController < ApplicationController
  # index,show,Puisque l'en-tête de la fenêtre de recherche est défini sur la page de recherche, il est exécuté au moment de cette action.
  before_action :search_product, only: [:index, :show, :search]

  #réduction

  private

 def search_product
    @p = Item.ransack(params[:q])  #Générer un objet de recherche
    @results = @p.result
  end
end

: q in (params [: q]) est la clé de paramètre par défaut pour les paramètres de recherche. Les éléments suivants sont synonymes, mais vous pouvez utiliser la méthode de ransack par défaut si la recherche est déjà définie ailleurs. Item.ransack(params[:q]) Item.search(params[:q])

@ p = Item.ransack (params [: q]) Après avoir créé l'objet de recherche ici, Je mets les résultats de la recherche dans @results avec @ results = @ p.result.

Description de la barre de recherche

Recherche vue


# @Mettez les informations de recherche dans p et transmettez-les au contrôleur.
<%= search_form_for @p, url: search_items_path do |f| %>
  <div class = 'nav-up'>
# :title_or_text_cont est du texte_Description indiquant si les caractères saisis dans le champ sont inclus dans le titre ou le texte
    <%= f.text_field :title_or_text_cont, placeholder: "Recherche par mots-clés", 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, 'Catégorie', class: 'label' %>
      <%= f.collection_select :genre_id_eq, Genre.where.not(id: 0), :id, :name,  include_blank: 'non spécifié', class: 'search-select' %>
    </div>
    <div class='label-select'>
      <%= f.label :status_id_eq, 'État du produit', class: 'label' %>
      <%= f.collection_select :status_id_eq, Status.where.not(id: 0), :id, :name,  include_blank: 'non spécifié', class: 'search-select' %>
    </div>
    <div class='label-select'>
      <%= f.label :bear_id_eq, 'Frais de port', class: 'label' %>
      <%= f.collection_select :bear_id_eq, Bear.where.not(id: 0), :id, :name,  include_blank: 'non spécifié', class: 'search-select' %>
    </div>
    <div class='label-select'>
      <%= f.label :day_id_eq, 'Jours d'expédition', class: 'label' %>
      <%= f.collection_select :day_id_eq, Day.where.not(id: 0), :id, :name,  include_blank: 'non spécifié', class: 'search-select' %>
    </div>
    <div class='label-select'>
      <%= f.label :price, 'prix', class: 'label' %>
      <%= f.radio_button :price_lteq, '' %>
non spécifié
      <%= f.radio_button :price_lteq, '1000' %>
1000 yens ou moins
      <%= f.radio_button :price_lteq, '2500' %>
2500 yens ou moins
      <%= f.radio_button :price_lteq, '5000' %>
5000 yens ou moins
      <br>
    </div>
  </div>
<% end %>

Afficher pour afficher les résultats de la recherche

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>Il n'y a pas de produit correspondant. Cherchons en changeant les conditions!</p>
  </div>
  <ul class='item-lists'>
    <% Item.all.each do |item| %>
      <%= render partial: "shared/item", locals: {item: item} %>
    <% end %>
  </ul>
<% end %>

Avec ce qui précède, vous pouvez affiner les produits qui correspondent aux résultats de la recherche. Je donnerai une explication détaillée à une date ultérieure.

Recommended Posts

[Rails] Recherche à partir de plusieurs colonnes + conditions avec Gem et ransack
Faisons une fonction de recherche avec Rails (ransack)
[Rails] Fonction de recherche et de liste de produits à partir de catégories à plusieurs niveaux
Utilisez plusieurs bases de données avec Rails 6.0
Implémentez une fonction de recherche affinée pour plusieurs modèles sans gemme Rails5.
Rechercher et exécuter une méthode à partir d'une instance avec traitement (java)
Implémentation de la recherche de balises de hachage comme Insta et Twitter dans Rails (pas de gemme)
[Rails] La rédaction de notes a créé un formulaire de recherche avancée avec ransack
Recherche intemporelle avec Rails + JavaScript (jQuery)
[Rails 6] Enregistrez-vous et connectez-vous avec l'authentification Devise + SNS (plusieurs liens sont autorisés)
[Rails] Gérez plusieurs modèles à l'aide de la gemme de devise
[Rails] Bénéficiez de rubocop avec un minimum d'effort
[Rails] Gérons les constantes avec config gem
[Rails] Recherche de livres avec l'API Amazon PA