[RUBY] Bereitstellen einer Suchleiste in Rails ~ Führen Sie eine Suche durch, indem Sie mehrere Tabellen verbinden

Einführung

Dieses Mal werden die Post-Daten (Post) angezeigt, indem eine Schlüsselwortsuche in der Suchleiste durchgeführt wird. Darüber hinaus werden wir mehrere Tabellen verknüpfen und implementieren, damit sie innerhalb dieses Bereichs durchsucht werden können.

Vollständiges Bild

Umgebung

MacOS 10.15.7 ruby 2.6.5 Ruby on Rails 6.0.0

Status des Autors

Tabelle

searchFunction1.png

Wir haben eine Tabelle mit dem Benutzer als "Benutzer", dem Beitrag als "Beitrag", dem Bild als "Bild" und der Präfektur als "Präfektur" (Startdaten) erstellt. (Der Inhalt der Tabelle wird zum Posten vereinfacht)

Die Beziehungen sind wie folgt.

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

Es sieht aus wie das. Ich habe auch Benutzer und Bild eingeführt, aber dieses Mal werde ich die Erklärung weglassen, weil sie nicht verwandt sind. Da die Präfektur mehrere Beiträge hat, wird sie als "has_many: posts" festgelegt. Da der Beitrag zur Präfektur gehört, heißt er "gehört zur Präfektur".

Ich werde arbeiten!

(1) Implementierung der Suchleisten-Einstellfunktion

①-1 Erstellen einer Suchleiste

Erstellen Sie auf diese Weise eine Suchleiste.

erb:index.html.erb


<%= form_with(url: search_posts_path, local: true, method: :get, class: "rootpageSearchForm") do |form| %>
  <%= form.text_field :keyword, placeholder: "Geben Sie ein Stichwort ein", id: 'Search_Form', class: "rootpageSearchForm__content" %>
  <%= form.submit "Suche", 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;
  }
}

Das ist alles. Das fertige Bild sieht so aus. searchForm.png

①-2 Erstellen einer Suchaktion

Definieren Sie eine neue Suchaktion in route.rb. Dieses Mal definieren wir es in der Post-Aktion in verschachtelter Form. Es ist wie folgt definiert.

routes.rb


Rails.application.routes.draw do
  resources :posts do
    collection do
      get 'search'
    end
  end
Einige der folgenden Punkte sind weggelassen...
end

Dieses Mal werden die entsprechenden Beiträge als Liste mit dem Suchbegriff angezeigt, sodass keine ID erforderlich ist.

collection do
  get 'search'
end

Ist definiert als.

Wenn Sie eine ID benötigen (z. B. eine Post-Detail-Seite), definieren Sie sie mit member anstelle von collection. Der Unterschied zwischen Sammlung und Mitglied besteht darin, ob die URL eine ID hat oder nicht.

Sammlung ・ ・ ・ Dem Routing ist keine ID zugeordnet. Mitglied ・ ・ ・ Eine ID ist an das Routing angehängt.

①-3 Suchmethode im Post-Modell definieren

class Post < ApplicationRecord
  ...Ein Teil des oben genannten wurde weggelassen
  def self.search(search)
    if search != ""
      Post.where('content LIKE(?) OR title LIKE(?), "%#{search}%", "%#{search}%")
    else
      Post.all
    end
  end
Einige der folgenden Punkte sind weggelassen...
end

Verwenden Sie die "where-Methode", um die "Instanz des Datensatzes, die der Bedingung entspricht" in Form eines Arrays abzurufen, das auf der im Argument beschriebenen Bedingung basiert.

Ich benutze die LIKE-Klausel, um nach mehrdeutigen Zeichenfolgen zu suchen.

String Bedeutung
Beliebige Zeichenfolge (einschließlich leerer Zeichenfolge)
_ Beliebiges Zeichen

Ausführungsbeispiel

Ausführungsbeispiel Bedeutung
where('title LIKE(?)', "a%") Titel beginnend mit a
where('title LIKE(?)', "%b") Titel mit der Endung b
where('title LIKE(?)', "d_") Titel mit c
where('title LIKE(?)', "%b") Titel aus zwei Buchstaben beginnend mit d
where('title LIKE(?)', "_e") Titel aus zwei Buchstaben, der mit e endet

Die Argumentensuche enthält die vom Suchformular gesendeten Parameter. Schreiben Sie daher if search! =" ", Und die Bedingung ist, dass ein Wert in das Suchformular eingegeben wird.

Wenn die Suchtaste gedrückt wird, wenn nichts in das Suchformular eingegeben wird (leerer Zustand), ist der Inhalt der an das Argument übergebenen Suche leer. Beschreiben Sie daher die Verarbeitung in diesem Fall in der else-Anweisung. Dieses Mal werden als "Post.all" alle Beiträge erfasst und angezeigt.

__ Grundsätzlich wird die Methode zur Interaktion mit der Tabelle im Modell platziert! __ __

①-4 Beschreiben Sie den Controller

Definieren Sie eine Suchaktion in posts_controller.rb.

posts_controller.rb


class PostsController < ApplicationController
  ...Ein Teil des oben genannten wurde weggelassen...
  def search
    @posts = Post.search(params[:keyword]).order(created_at: :desc)
  end
  ...Einige der folgenden Punkte sind weggelassen...

Schreiben Sie "params [: keyword]" in das Argument der Suchmethode und übergeben Sie das Suchergebnis.

Da die Suchergebnisse in der Reihenfolge der neuesten Beiträge angeordnet sind, wird sie auch als "Reihenfolge (created_at: desc)" bezeichnet.

①-5 Erstellen Sie search.html.erb und zeigen Sie die Suchergebnisse an

Erstellen Sie anschließend search.html.erb, um den Suchergebnisbildschirm anzuzeigen, und der Vorgang ist abgeschlossen.

ruby:search.html.erb


<div class="wrapper">
  <% @posts.each do |post| %>
    <div class='contents row'>
    ...Unten weggelassen...
  <% end %>
</div>

①-6 Abgeschlossen!

Sie können die Suchergebnisse jetzt über die Suchleiste und die Stichwortsuche anzeigen. Mit den Einstellungen bis zu diesem Punkt werden die "Inhalte (Post-Text)" und "Titel (Post-Titel)" der Post-Tabelle durchsucht.

(2) Verbinden Sie andere Tabellen und fügen Sie sie dem Suchziel hinzu.

Dieses Mal möchte ich dem Suchziel "Name (Präfekturname)" in der Präfekturtabelle hinzufügen, damit Sie auch nach Präfekturnamen suchen können.

Wir werden dem Postmodell eine Beschreibung hinzufügen.

class Post < ApplicationRecord
  ...Ein Teil des oben genannten wurde weggelassen
  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
Einige der folgenden Punkte sind weggelassen...
end

Die Präfekturtabelle wird auch als "Joins (: Präfektur)" hinzugefügt, die durchsucht werden sollen. Die "Join-Methode" ist eine "Methode", die verwendet wird, wenn Sie mehrere Tabellen zu einer verbinden möchten. In diesem Fall werden die Posttabelle und die Präfekturtabelle zusammengefügt und als eine Tabelle behandelt.

Im Argumentteil der where-Methode wird "OR prefectures.name LIKE (?)" Hinzugefügt, um den Präfekturnamen als Suchziel anzugeben. Fügen Sie ein "% # {search}%" für diesen Betrag hinzu und Sie sind fertig.

Schließlich

Da ich ein Anfänger bin, würde ich es begrüßen, wenn Sie auf Fehler hinweisen könnten. Danke, dass du bis zum Ende zugesehen hast.

Recommended Posts

Bereitstellen einer Suchleiste in Rails ~ Führen Sie eine Suche durch, indem Sie mehrere Tabellen verbinden
So schreiben Sie eine Datumsvergleichssuche in Rails
Fügen Sie eine Suchfunktion in Rails hinzu.
So implementieren Sie Suchfunktionen in Rails
So fügen Sie ein Video in Rails ein
So implementieren Sie eine Diashow mit Slick in Rails (einzeln und mehrfach nacheinander)
Mit Rails in eine Tag-zu-URL-Zeichenfolge konvertieren
So implementieren Sie eine ähnliche Funktion in Rails
So erstellen Sie einfach ein Pulldown mit Rails
Wirf Raw SQL mit Rails auf ein Lesereplikat
[So fügen Sie ein Video mit Rails in haml ein]
Ich möchte eine Funktion in der Rails Console definieren
[Rails 6] So legen Sie ein Hintergrundbild in Rails [CSS] fest
[Rails] So laden Sie JavaScript in einer bestimmten Ansicht
[Rails] Erstellen eines Suchfelds
Verwendung von Rails Join
So zeigen Sie Diagramme in Ruby on Rails an (LazyHighChart)
Verwenden Sie mehrere Kontrollkästchen in Rails6!
Wenden Sie CSS auf eine bestimmte Ansicht in Ruby on Rails an
[Rails] Eine einfache Möglichkeit, eine Selbsteinführungsfunktion in Ihrem Profil zu implementieren
Implementieren Sie eine verfeinerte Suchfunktion für mehrere Modelle ohne Rails5-Juwel.
So benennen Sie ein Modell mit externen Schlüsseleinschränkungen in Rails um
Vorbereiten der Erstellung einer Rails-Anwendung
Erstellen Sie eine neue App mit Rails
Implementieren Sie ein Kontaktformular in Rails
So installieren Sie jQuery in Rails 6
So installieren Sie Swiper in Rails
Wechseln Sie in einem neuen Ruby on Rails-Projekt von SQLite3 zu PostgreSQL
[Rails] Ich möchte Daten verschiedener Modelle in einem Formular senden
So erstellen Sie eine Abfrage mithilfe von Variablen in GraphQL [Verwenden von Ruby on Rails]
[Rails] Ich habe versucht, eine Transaktion zu implementieren, die mehrere DB-Prozesse kombiniert
Ich möchte im Dialogfeld mehrere Elemente mit einem benutzerdefinierten Layout auswählen
So erstellen Sie eine Zip-Datei beim Gruppieren von Datenbanksuchergebnissen in Java
So aktualisieren Sie Benutzeränderungen in Rails Devise, ohne ein Kennwort einzugeben
Was ist zu tun, wenn auf den Schienen cHoge.connection aufruft, um eine Verbindung herzustellen? C.
Führen Sie eine Präfixsuche in Swifts Firestore durch
Bei der Suche nach mehreren in einem Java-Array
So ändern Sie den App-Namen in Rails
Verwendung von MySQL im Rails-Tutorial
Notation zum Einfügen von Variablen in eine Zeichenfolge
[Rails] So erstellen Sie eine Teilvorlage
So implementieren Sie Ranking-Funktionen in Rails
So veröffentlichen Sie eine Bibliothek in jCenter
Verwendung von credentials.yml.enc aus Rails 5.2
Einführung von # 10 devise_token_auth zum Erstellen einer Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6
[Schienen für Anfänger] Geben Sie das Übergangsziel an, nachdem Sie sich bei mehreren Devise-Modellen angemeldet haben
[Schienen] So registrieren Sie mehrere Datensätze in der Zwischentabelle mit einer Zuordnung von vielen zu vielen
Ein Memo zum Erstellen eines einfachen Formulars, das nur HTML und CSS in Rails 6 verwendet
So erstellen Sie eine Beurteilungsmethode, um nach einem beliebigen Zeichen im Array zu suchen
So speichern Sie gleichzeitig Daten in einem Modell, das einem verschachtelten Formular zugeordnet ist (Rails 6.0.0)