[RUBY] Implémentez une fonction de recherche affinée pour plusieurs modèles sans gemme Rails5.

Que mettre en œuvre

Implémentez la sélection de conditions déroulantes de correspondance exacte, de correspondance de préfixe, de correspondance de suffixe et de correspondance partielle avec les deux modèles que vous souhaitez rechercher dans le formulaire de recherche. (Image de référence) http://drive.google.com/uc?export=view&id=1vsAOuXvOIV1IzDxaPhUJ0rLL0V0AgPUC

<img src=https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F700999%2Fa126f999-9e5e-f80c-913d-e7ee2c86652a.gif?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=b85b97e43acfbe1b95ec86c20570bce4>

la mise en oeuvre

Comme nous ne créerons pas de modèle cette fois, nous créerons uniquement le contrôleur et afficherons Exécutez rails g controller Seraches search avec la commande. Ajoutez get'users / search '=>' recherches # search' à routes.rb

Tout d'abord, créez un formulaire de recherche.

views/Afficher Je souhaite remplir le formulaire de recherche


<%= form_tag(users_search_path, method: :get) do %>
    <%= text_field_tag 'search[content]' %>
   	<%= select_tag 'search[model]', options_for_select({ "utilisateur" => "user", "marque" => "muscle" }) %>
   	<%= select_tag 'search[how]', options_for_select({ "Correspondance parfaite" => "match", "Correspondance de préfixe" => "forward", "Match en arrière" => "backward", "Match partiel" => "partical"  }) %>
    <%= submit_tag 'Chercher', class: "btn btn-primary" %>
  <% end %>

Puis implémentez le contrôleur

users/searches_controller.rb



def search
    @content = params['search']['content']
    @how = params['search']['how']
    @model = params['search']['model']
    @datas = search_for(@how, @model, @content)
end

private

  def match(model, content)
    if model == 'user'
      User.where(name: content)
    elsif model == 'muscle'
      Muscle.where(work_tag: content)
    end
  end

  def forward(model, content)
    if model == 'user'
      User.where('name LIKE ?', "#{content}%")
    elsif model == 'muscle'
      Muscle.where('work_tag LIKE ?', "#{content}%")
    end
  end

  def backward(model, content)
    if model == 'user'
      User.where('name LIKE ?', "%#{content}")
    elsif model == 'muscle'
      Muscle.where('work_tag LIKE ?', "%#{content}")
    end
  end

  def partical(model, content)
    if model == 'user'
      User.where('name LIKE ?', "%#{content}%")
    elsif model == 'muscle'
      Muscle.where('work_tag LIKE ?', "%#{content}%")
    end
  end

  def search_for(how, model, content)
    case how
    when 'match'
      match(model, content)
    when 'forward'
      forward(model, content)
    when 'backward'
      backward(model, content)
    when 'partical'
      partical(model, content)
    end
  end
end

Description du contrôleur

Puisque je recherche la colonne work_tag de la table Muscles et la colonne nom de la table Users, veuillez les modifier pour chaque individu.

    @content = params['search']['content']
    @how = params['search']['how']
    @model = params['search']['model']
    @datas = search_for(@how, @model, @content)

Commentaire séparé

-Tout d'abord, lorsque l'utilisateur exécute une recherche à partir de la vue où form_tag est installé, search_controller est appelé et le contenu de la recherche envoyé depuis la vue est stocké dans @content. ・ Conditions de stockage telles que la correspondance exacte envoyée depuis la vue dans @how ・ Stockez le modèle que vous souhaitez rechercher, tel que l'utilisateur envoyé depuis la vue, dans @model -Invoquez la méthode search_for à @datas et passez (@how, @model, @content) comme argument.

Regardez search_for

def search_for(how, model, content)
    case how
    when 'match'
      match(model, content)
    when 'forward'
      forward(model, content)
    when 'backward'
      backward(model, content)
    when 'partical'
      partical(model, content)
    end
end

'Match' 'est une correspondance exacte et partcial' 'est une correspondance partielle, comme vous pouvez le voir en regardant form_tag. -Lorsque le contenu du how dans l'instruction case est `` 'match' ', la méthode match est appelée dans la méthode serach_for.

Regardons la méthode de match

def match(model, content)
    if model == 'user'
      User.where(name: content)
    elsif model == 'muscle'
      Muscle.where(work_tag: content)
    end
  end

-Dans la méthode de correspondance appelée, le contenu du modèle stocké est conditionnel selon qu'il s'agit d'un utilisateur ou d'un muscle. -Bien sûr, puisqu'il s'agit d'une correspondance exacte, dans le cas de User, tout ce qui correspond aux colonnes de contenu et de nom envoyées depuis le formulaire dans ʻUser.where` est acquis. -La méthode de correspondance est maintenant exécutée et le résultat est stocké dans @datas.

Afficher les résultats de la recherche

rails:views/seaches/searche.html.erb



<% if @model == "user" %>
<div class="row  justify-content-center">
  <h2>Liste d'utilisateur</h2>
</div>
<div class="row  justify-content-center">
  <% @datas.each do |datas| %>
  <table class="table table-striped table-bordered">
   	<thead>
		<tr>
			<th>Nom d'utilisateur</th>
	        </tr>
       </thead>
   	<tbody>
	   	<tr>
	    	<td>
	    	  <%= link_to datas.name, user_path(datas.id) %>
	    	</td>
	    </tr>
	</tbody>
	</table>
	<% end %>
</div>

<% elsif @model == "muscle"%>
<div class="row  justify-content-center">
<table class="table table-striped table-bordered">
   	<thead>
		<tr>
			<th>Liste de balises</th>
	        </tr>
       </thead>
   	<tbody>
	   	<tr>
	    	<td>
	    		<%= link_to datas.work_tag, muscle_path(datas.id) %>
	    	</td>
	    </tr>
	</tbody>
	</table>
</div>
<% else %>
<% end %>

-Changez le html à afficher selon que le modèle est utilisateur ou muscle dans l'instruction if. -Tournez les éléments stockés dans @datas à chaque fois pour les afficher dans une liste.

finalement

Si vous comprenez la méthode, vous pouvez facilement l'implémenter sans gemme. Veuillez commenter si quelque chose manque ou n'est pas clair

Recommended Posts

Implémentez une fonction de recherche affinée pour plusieurs modèles sans gemme Rails5.
[Pour les débutants de Rails] Implémentation de la fonction de recherche multiple sans Gem
[Ruby on Rails] Comment implémenter la fonction de balisage / recherche incrémentielle pour les articles (sans gemme)
[Rails] Implémenter la fonction de recherche d'utilisateurs
Ajoutez une fonction de recherche dans Rails.
[Rails] Gérez plusieurs modèles à l'aide de la gemme de devise
Implémenter un bouton de partage dans Rails 6 sans utiliser Gem
Implémentez la fonction de recherche de correspondance partielle sans utiliser Ransuck
[Rails] Comment implémenter un test unitaire d'un modèle
Faisons une fonction de recherche avec Rails (ransack)
Implémenter la fonction de recherche de publication dans l'application Rails (méthode where)
[Rails 6.0] J'ai essayé d'implémenter une fonction de recherche de balises (une fonction pour affiner par balises) [no gem]
[Rails] Implémenter la fonction de fin d'événement (suppression logique) en utilisant la paranoïa (gem)
Fournir une barre de recherche dans Rails ~ Effectuer une recherche en joignant plusieurs tables
[Rails] Recherche à partir de plusieurs colonnes + conditions avec Gem et ransack
Implémentation de la fonction de recherche floue Rails
Fonction de recherche à l'aide de [rails] ransack
[Rails] Création d'un champ de recherche
[Rails] Implémenter la fonction de publication d'images
[Rails] Un moyen simple d'implémenter une fonction d'auto-introduction dans votre profil
J'ai créé une fonction de réponse pour l'extension Rails Tutorial (Partie 1)
J'ai créé une fonction de réponse pour l'extension Rails Tutorial (Partie 5):
Mode API Rails J'ai essayé d'implémenter la fonction de recherche multiple par mot-clé à l'aide de tableaux et d'un traitement itératif.
[Rails] Répertorier les instances de plusieurs modèles
Implémenter une fonction de connexion simple dans Rails
Mettre en œuvre une fonctionnalité similaire pour les articles
Implémenter un formulaire de contact dans Rails
[Rails] Implémentation de la fonction de catégorie d'ascendance gemme
Implémenter la fonction de téléchargement CSV dans Rails
Comment mettre en œuvre un diaporama en utilisant Slick in Rails (un par un et plusieurs par un)
[Rails] J'ai essayé d'implémenter une transaction qui combine plusieurs processus DB
[Rails] Implémentez la fonction d'achat de produits avec une carte de crédit enregistrée auprès de PAY.JP
J'ai créé une fonction de réponse pour l'extension Rails Tutorial (Partie 2): Changer de modèle