[RUBY] Fournir une barre de recherche dans Rails ~ Effectuer une recherche en joignant plusieurs tables

introduction

Cette fois, les données de publication (Post) sont affichées en effectuant une recherche par mot-clé dans la barre de recherche. En outre, nous allons joindre plusieurs tables et les implémenter afin qu'elles puissent être recherchées dans cette plage.

Image complète

environnement

MacOS 10.15.7 ruby 2.6.5 Ruby on Rails 6.0.0

Statut de l'auteur

table

searchFunction1.png

Nous avons créé un tableau avec l'utilisateur comme "Utilisateur", le message comme "Publier", l'image comme "Image" et la préfecture comme "Préfecture" (données de départ). (Le contenu du tableau est simplifié pour l'affichage)

Les relations sont les suivantes.

user.rb


has_many :posts, dependent: :destory

post.rb


belongs_to :user
belongs_to :prefecture

has_many :images, dependent: :destory


accepts_nested_attributes_for :images, allow_destroy: true

image.rb


belongs_to :post

mount_uploader :image, ImageUploader

prefecture.rb


has_many :posts

Ça ressemble à ça. J'ai également présenté l'utilisateur et l'image, mais cette fois j'omettrai l'explication car ils ne sont pas liés. Puisque la préfecture a plusieurs messages, il est défini comme "has_many: posts". Puisque le poste appartient à la préfecture, il sera "appartient à: préfecture".

Je vais travailler!

(1) Mise en œuvre de la fonction de réglage de la barre de recherche

①-1 Création d'une barre de recherche

Créez une barre de recherche de cette manière.

erb:index.html.erb


<%= form_with(url: search_posts_path, local: true, method: :get, class: "rootpageSearchForm") do |form| %>
  <%= form.text_field :keyword, placeholder: "Entrez un mot-clé", id: 'Search_Form', class: "rootpageSearchForm__content" %>
  <%= form.submit "Chercher", class: "rootpageSearchForm__bottum" %>
<% end %>

index.scss


.rootpageSearchForm {
  width: auto;
  &__content {
    width: 40vw;
    height: 30px;
    color: #000000;
    border-radius: 5px;
    border-color: #008bbb;
  }
  &__bottum {
    margin-left: 0.5vw;
    height: 30px;
    width: 150px;
    border-radius: 20px;
    background-color: #87cefa;
    border: none;
    box-shadow: 0 0 8px gray;
    color: #ffffff;
    -webkit-transition: all 0.3s ease;
    -moz-transition: all 0.3s ease;
    -o-transition: all 0.3s ease;
    transition: all 0.3s ease;
  }
  .rootpageSearchForm__bottum:hover {
    background-color: #00bfff;
  }
}

C'est tout. L'image terminée ressemble à ceci. searchForm.png

①-2 Création d'une action de recherche

Définissez une nouvelle action de recherche dans routes.rb. Cette fois, nous le définirons sous une forme imbriquée dans l'action de publication. Il est défini comme suit.

routes.rb


Rails.application.routes.draw do
  resources :posts do
    collection do
      get 'search'
    end
  end
Certains des éléments suivants sont omis...
end

Cette fois, les publications correspondantes sont affichées sous forme de liste avec le mot-clé de recherche, donc l'identifiant n'est pas nécessaire.

collection do
  get 'search'
end

Est défini comme.

Si vous avez besoin d'un identifiant (comme une page de détails de publication), utilisez un membre au lieu d'une collection pour le définir. La différence entre collection et membre est de savoir si l'URL a un identifiant ou non.

collection ・ ・ ・ Aucun identifiant n'est attaché au routage. membre ・ ・ ・ Un identifiant est attaché au routage.

①-3 Définir la méthode de recherche dans le post-modèle

class Post < ApplicationRecord
  ...Partie de ce qui précède omise
  def self.search(search)
    if search != ""
      Post.where('content LIKE(?) OR title LIKE(?), "%#{search}%", "%#{search}%")
    else
      Post.all
    end
  end
Certains des éléments suivants sont omis...
end

Utilisez la méthode where pour obtenir" l'instance de l'enregistrement qui correspond à la condition "sous la forme d'un tableau basé sur la condition décrite dans l'argument.

J'utilise la clause LIKE pour rechercher des chaînes ambiguës.

Chaîne sens
Chaîne de caractères arbitraire (y compris la chaîne de caractères vide)
_ N'importe quel personnage

Exemple d'exécution

Exemple d'exécution sens
where('title LIKE(?)', "a%") Titres commençant par un
where('title LIKE(?)', "%b") Titres se terminant par b
where('title LIKE(?)', "d_") Titres contenant c
where('title LIKE(?)', "%b") Titre à deux lettres commençant par d
where('title LIKE(?)', "_e") Titre à deux lettres se terminant par e

La recherche d'argument contient les paramètres envoyés depuis le formulaire de recherche. Par conséquent, écrivez if search! =" ", Et la condition est qu'une valeur soit entrée dans le formulaire de recherche.

Si le bouton de recherche est enfoncé alors que rien n'est entré dans le formulaire de recherche (état vide), le contenu de la recherche passée à l'argument sera vide, décrivez donc le traitement dans ce cas dans l'instruction else. Cette fois, en tant que «Post.all», tous les messages seront acquis et affichés.

__ Fondamentalement, la méthode d'interaction avec la table est placée dans le modèle! __

①-4 Décrivez le contrôleur

Définissez une action de recherche dans posts_controller.rb.

posts_controller.rb


class PostsController < ApplicationController
  ...Partie de ce qui précède omise...
  def search
    @posts = Post.search(params[:keyword]).order(created_at: :desc)
  end
  ...Certains des éléments suivants sont omis...

Écrivez params [: mot-clé] dans l'argument de la méthode de recherche et transmettez le résultat de la recherche.

De plus, étant donné que les résultats de la recherche sont organisés dans l'ordre des articles les plus récents, il est décrit comme order (created_at: desc).

①-5 Créez search.html.erb et affichez les résultats de la recherche

Après cela, créez search.html.erb pour afficher l'écran des résultats de la recherche et c'est terminé.

ruby:search.html.erb


<div class="wrapper">
  <% @posts.each do |post| %>
    <div class='contents row'>
    ...Omis ci-dessous...
  <% end %>
</div>

①-6 Terminé!

Vous pouvez maintenant afficher les résultats de la recherche à l'aide de la barre de recherche et de la recherche par mot-clé. Avec les paramètres jusqu'à ce point, le "contenu (texte de l'article)" et le "titre (titre de l'article)" de la table des articles sont recherchés.

(2) Rejoignez d'autres tables et ajoutez-les à la cible de recherche.

Cette fois, je voudrais ajouter "nom (nom de la préfecture)" dans le tableau Préfecture à la cible de recherche afin que vous puissiez également effectuer une recherche par nom de préfecture.

Nous ajouterons une description au modèle de publication.

class Post < ApplicationRecord
  ...Partie de ce qui précède omise
  def self.search(search)
    if search != ""
      Post.joins(:prefecture).where('content LIKE(?) OR title LIKE(?) OR prefectures.name LIKE(?)', "%#{search}%", "%#{search}%", "%#{search}%")
    else
      Post.all
    end
  end
Certains des éléments suivants sont omis...
end

La table prefecture est également ajoutée en tant que «jointures (: prefecture)» à rechercher. La méthode de jointure est une méthode utilisée lorsque vous souhaitez joindre plusieurs tables en une seule. Dans ce cas, la table de publication et la table de préfecture sont jointes et traitées comme une seule table.

Dans la partie argument de la méthode where, OR prefectures.name LIKE (?) ' Est ajouté pour spécifier le nom de la préfecture comme cible de recherche. Ajoutez un "% # {search}% " pour ce montant et vous avez terminé.

finalement

Puisque je suis un débutant, je vous serais reconnaissant si vous pouviez signaler des erreurs. Merci d'avoir regardé jusqu'à la fin.

Recommended Posts

Fournir une barre de recherche dans Rails ~ Effectuer une recherche en joignant plusieurs tables
Comment écrire une recherche de comparaison de dates dans Rails
Ajoutez une fonction de recherche dans Rails.
Comment implémenter la fonctionnalité de recherche dans Rails
Comment insérer une vidéo dans Rails
Comment mettre en œuvre un diaporama en utilisant Slick in Rails (un par un et plusieurs par un)
Convertir en balise dans la chaîne d'URL avec Rails
Comment implémenter une fonctionnalité similaire dans Rails
Comment créer facilement un pull-down avec des rails
Lancer du SQL brut pour lire le réplica avec Rails
[Comment insérer une vidéo dans un hameau avec Rails]
Je souhaite définir une fonction dans la console Rails
[Rails 6] Comment définir une image d'arrière-plan dans Rails [CSS]
[Rails] Comment charger JavaScript dans une vue spécifique
[Rails] Création d'un champ de recherche
Comment utiliser la jonction de rails
Comment afficher des graphiques dans Ruby on Rails (LazyHighChart)
Utilisez plusieurs cases à cocher dans Rails6!
Appliquer le CSS à une vue spécifique dans Ruby on Rails
[Rails] Un moyen simple d'implémenter une fonction d'auto-introduction dans votre profil
Implémentez une fonction de recherche affinée pour plusieurs modèles sans gemme Rails5.
Comment renommer un modèle avec des contraintes de clé externes dans Rails
Préparation à la création de l'application Rails
Créer une nouvelle application avec Rails
Implémenter un formulaire de contact dans Rails
Comment installer jQuery dans Rails 6
Comment installer Swiper in Rails
Passer de SQLite3 à PostgreSQL dans un nouveau projet Ruby on Rails
[Rails] Je souhaite envoyer des données de différents modèles dans un formulaire
Comment créer une requête à l'aide de variables dans GraphQL [Utilisation de Ruby on Rails]
[Rails] J'ai essayé d'implémenter une transaction qui combine plusieurs processus DB
Je souhaite sélectionner plusieurs éléments avec une disposition personnalisée dans la boîte de dialogue
Pour créer un fichier Zip lors du regroupement des résultats de recherche de base de données en Java
Comment mettre à jour les modifications utilisateur dans Rails Devise sans entrer de mot de passe
Que faire lorsque "call'Hoge.connection 'pour établir une connexion" apparaît sur les rails c
Effectuez une recherche de préfixe dans Swift's Firestore
Lors de la recherche de plusieurs dans un tableau Java
Comment changer le nom de l'application dans les rails
Comment utiliser MySQL dans le didacticiel Rails
Notation pour mettre des variables dans une chaîne
[rails] Comment créer un modèle partiel
Comment implémenter la fonctionnalité de classement dans Rails
Comment publier une bibliothèque dans jCenter
Comment utiliser credentials.yml.enc introduit à partir de Rails 5.2
Introduction de # 10 devise_token_auth pour créer une API de tableau d'affichage avec autorisation d'authentification dans Rails 6
[Rails pour débutants] Spécifiez la destination de la transition après vous être connecté à plusieurs modèles Devise
[Rails] Comment enregistrer plusieurs enregistrements dans la table intermédiaire avec une association plusieurs-à-plusieurs
Un mémo pour créer un formulaire simple en utilisant uniquement HTML et CSS dans Rails 6
Comment faire une méthode de jugement pour rechercher n'importe quel caractère dans le tableau
Comment stocker simultanément des données dans un modèle associé à une forme imbriquée (Rails 6.0.0)