[RUBY] Implementieren Sie die Teilübereinstimmungssuchfunktion ohne Ransuck

Ich habe die Teilübereinstimmungssuchfunktion ohne Verwendung von Lansuck implementiert, daher werde ich sie zusammenfassen. Dieses Mal erstellen wir eine einfache Funktion, mit der Sie den Namen und die E-Mail-Adresse eingeben und die Informationen des entsprechenden Benutzers durch teilweisen Abgleich abrufen können.

Beispiel
Suchen Sie im Namensformular nach "Nein" und im E-Mail-Adressformular nach ""
             ↓
Nobita Nobi [email protected]
Es fühlt sich an wie Ausgabe. ich will

Abschließend werde ich zuerst den Code veröffentlichen.

routes.rb


Rails.application.routes.draw do
  root 'users#index'
  resources :users
end

index.html


 <h1>Lassen Sie uns eine teilweise Übereinstimmungssuche nach Doraemon-Zeichen durchführen</h1>
<%= form_with(url: 'users', local: true, method: :get) do |f| %>
  <span class="small">Suchziel: Name, E-Mail-Adresse</span>
    <div>
      <%= f.label :name, 'Name' %>
      <%= f.text_field :name , value: @search_params[:name] %>
    </div>
    <div>
      <%= f.label :email, 'Mail Adresse' %>
      <%= f.text_field :email, value: @search_params[:email] %>
    </div>
  <%= f.submit 'Suche', class: 'btn btn-default' %>
<%end%>

<h1>Suchergebnisse</h1>
  <% @users.each do |user| %>
    <%= user.name %>
    <%= user.email %>
  <% end %>

users_controller.rb


class UsersController < ApplicationController
  def index
    @search_params = search_params
    @users = User.search(search_params)
  end

  private

  def search_params
    params.permit( :name, :email  )
  end
end

user.rb


class User < ApplicationRecord
  scope :search, -> (search_params) do
    return if search_params.blank?
      name_like(search_params[:name] )
      .email_like(search_params[:email])
    end
  scope :name_like, -> (name){where("name LIKE ?" ,"%#{name}%")}
  scope :email_like, -> (email){where("email LIKE ?", "%#{email}%")}
end

schema.rb



ActiveRecord::Schema.define(version: 2020_10_10_011424) do

  create_table "users", force: :cascade do |t|
    t.string "name"
    t.string "email"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

end

seeds.rb


User.create!(name: "Nobita Nobi",email: "[email protected]")
User.create!(name: "Takeshi Gouda",email: "[email protected]")
User.create!(name: "Suneo Koshikawa",email: "[email protected]")
User.create!(name: "Doraemon",email: "[email protected]")
User.create!(name: "Dorami-Chan",email: "[email protected]")
User.create!(name: "Quelle Shizuka",email: "[email protected]")

Ich werde jeden erklären. Zunächst aus der Erklärung der Sicht

index.html


 <h1>Lassen Sie uns eine teilweise Übereinstimmungssuche nach Doraemon-Zeichen durchführen</h1>
<%= form_with(url: 'users', local: true, method: :get) do |f| %>
  <span class="small">Suchziel: Name, E-Mail-Adresse</span>
    <div>
      <%= f.label :name, 'Name' %>
      <%= f.text_field :name , value: @search_params[:name] %>
    </div>
    <div>
      <%= f.label :email, 'Mail Adresse' %>
      <%= f.text_field :email, value: @search_params[:email] %>
    </div>
  <%= f.submit 'Suche', class: 'btn btn-default' %>
<%end%>

<h1>Suchergebnisse</h1>
  <% @users.each do |user| %>
    <%= user.name %>
    <%= user.email %>
  <% end %>

Zuallererst hier

<%= form_with(scope: :search ,url: 'users', local: true, method: :get) do |f| %>

Das Suchformular verwendet form_with. Der Unterschied zwischen form_tag und form_for wird unter der folgenden URL leicht verständlich erläutert. https://qiita.com/hmmrjn/items/24f3b8eade206ace17e (Bisher wurde form_tag verwendet, wenn es kein verwandtes Modell gab, aber form_for wurde verwendet, wenn es ein verwandtes Modell gab, aber es ist in Rails 5.1 veraltet. Als konkretes Beispiel möchte ich nur Benutzerinformationen verwenden ( Bei der Suche) usw. ist form_tag Ich möchte Benutzerinformationen registrieren → Ich habe form_for verwendet, als die zu registrierende Datenbank vorhanden war. ) Form_with, das seit Rails 5.1 empfohlen wurde, teilt die Verarbeitung gut auf und führt sie aus. Außerdem ist Ajax für die asynchrone Kommunikation standardmäßig implementiert. Da JS diesmal nicht verwendet wird, wird local: true angegeben, um das Remote-Formular zu deaktivieren, und Daten werden im HTML-Format mit der Methode: get übertragen.

Schauen wir uns als nächstes den Controller an.

``users_controller.rb`


class UsersController < ApplicationController
  def index
    @search_params = search_params
    @users = User.search(search_params)
  end

  private

  def search_params
    params.permit( :name, :email  )
  end
end

Das einzige, was hier ist, ist User.search (search_params). Dies ist die Suchmethode, aber das Benutzermodell deckt die Teilübereinstimmungssuchfunktion ab. Für den gesendeten Wert gibt die Suche eine teilweise Übereinstimmung mit Name und E-Mail zurück. Dann beziehen Sie sich auf Modell.

user.rb


class User < ApplicationRecord
  scope :search, -> (search_params) do
    return if search_params.blank?
      name_like(search_params[:name] )
      .email_like(search_params[:email])
    end
  scope :name_like, -> (name){where("name LIKE ?" ,"%#{name}%")}
  scope :email_like, -> (email){where("email LIKE ?", "%#{email}%")}
end

Der Suchbereich fliegt hierher, führt eine Teilverarbeitung nacheinander durch und wird dann an die Steuerung zurückgegeben. return if search_params.blank? Durch Setzen wird der Prozess dort gestoppt und an die Steuerung zurückgegeben, auch wenn kein Wert eingegeben wurde. Wenn das Suchziel wie dieses Mal mehrere ist, wie z. B.: Name: E-Mail, werden die Parameter iterativ verarbeitet und die Suche wird nacheinander zurückgegeben.

Das ist alles für diese Zeit. Bitte weisen Sie immer mehr darauf hin, ob hier etwas anderes war.

Recommended Posts

Implementieren Sie die Teilübereinstimmungssuchfunktion ohne Ransuck
[Schienen] Implementieren Sie die Benutzersuchfunktion
Suchfunktion mit [Rails] Ransack
Implementieren Sie die Kategoriefunktion mithilfe von Vorfahren
Implementieren Sie die Suchfunktion mithilfe der LIKE-Klausel
Implementieren Sie eine verfeinerte Suchfunktion für mehrere Modelle ohne Rails5-Juwel.
Implementieren Sie eine Freigabeschaltfläche in Rails 6, ohne Gem zu verwenden
Implementieren Sie die Star Five-Funktion mit der for-Anweisung
Implementieren Sie die Sternebewertungsfunktion mit Raty in Rails 6
Implementieren Sie die Produktkategoriefunktion mit Abstammung ① (Vorbereitung)
So implementieren Sie die Brotkrumenfunktion mit gretel
Ablauf zur Implementierung der Image-Posting-Funktion mit ActiveStorage
Implementieren Sie die Suchfunktion mit der Rakuten Books (DVD) API
[Ruby on Rails] So implementieren Sie die Tagging- / inkrementelle Suchfunktion für Posts (ohne Gem)
Fortsetzung ・ Ablauf zur Implementierung der Image-Posting-Funktion mit ActiveStorage
Implementieren Sie die Nachsuchfunktion in der Rails-Anwendung (where-Methode).
Implementieren Sie Test Double in JUnit, ohne externe Bibliotheken zu verwenden
[Für Anfänger von Rails] Mehrfachsuchfunktion ohne Gem implementiert