[RUBY] Implementieren Sie eine verfeinerte Suchfunktion für mehrere Modelle ohne Rails5-Juwel.

Was zu implementieren

Implementieren Sie die Auswahl der Pulldown-Bedingungen für die genaue Übereinstimmung, Präfixübereinstimmung, Suffixübereinstimmung und Teilübereinstimmung mit den beiden Modellen, die Sie im Suchformular suchen möchten. (Referenzbild) 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>

Implementierung

Da wir dieses Mal kein Modell erstellen, erstellen wir nur den Controller und die Ansicht Führen Sie mit dem Befehl Rails G Controller Seraches Search aus. Fügen Sie "get'users / search" => "search # search" zu "route.rb" hinzu

Richten Sie zunächst ein Suchformular ein.

views/Ansicht Ich möchte das Suchformular ausfüllen


<%= form_tag(users_search_path, method: :get) do %>
    <%= text_field_tag 'search[content]' %>
   	<%= select_tag 'search[model]', options_for_select({ "Nutzer" => "user", "Etikett" => "muscle" }) %>
   	<%= select_tag 'search[how]', options_for_select({ "Perfekte Übereinstimmung" => "match", "Präfixübereinstimmung" => "forward", "Rückwärtsspiel" => "backward", "Teilweise Übereinstimmung" => "partical"  }) %>
    <%= submit_tag 'Suche', class: "btn btn-primary" %>
  <% end %>

Implementieren Sie dann die Steuerung

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

Beschreibung der Steuerung

Da ich die Spalte work_tag der Tabelle Muscles und die Spalte name der Tabelle Users durchsuche, ändern Sie sie bitte für jede Person.

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

Getrennter Kommentar

Schauen Sie sich search_for an

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' ist eine exakte Übereinstimmung, und' partcial' ist eine teilweise Übereinstimmung, wie Sie anhand von form_tag sehen können. -Wenn der Inhalt der case-Anweisung "match" ist, wird die match-Methode in der serach_for-Methode aufgerufen.

Schauen wir uns die Match-Methode an

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

-In der aufgerufenen Match-Methode ist der Inhalt des gespeicherten Modells abhängig davon, ob es sich um einen Benutzer oder einen Muskel handelt.

Suchergebnisse anzeigen

rails:views/seaches/searche.html.erb



<% if @model == "user" %>
<div class="row  justify-content-center">
  <h2>Benutzerliste</h2>
</div>
<div class="row  justify-content-center">
  <% @datas.each do |datas| %>
  <table class="table table-striped table-bordered">
   	<thead>
		<tr>
			<th>Nutzername</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>Tag-Liste</th>
	        </tr>
       </thead>
   	<tbody>
	   	<tr>
	    	<td>
	    		<%= link_to datas.work_tag, muscle_path(datas.id) %>
	    	</td>
	    </tr>
	</tbody>
	</table>
</div>
<% else %>
<% end %>

Schließlich

Wenn Sie die Methode verstehen, können Sie sie problemlos ohne Edelstein implementieren. Bitte kommentieren Sie, wenn etwas fehlt oder unklar ist.

Recommended Posts

Implementieren Sie eine verfeinerte Suchfunktion für mehrere Modelle ohne Rails5-Juwel.
[Für Anfänger von Rails] Mehrfachsuchfunktion ohne Gem implementiert
[Ruby on Rails] So implementieren Sie die Tagging- / inkrementelle Suchfunktion für Posts (ohne Gem)
[Schienen] Implementieren Sie die Benutzersuchfunktion
Fügen Sie eine Suchfunktion in Rails hinzu.
[Schienen] Verwalten Sie mehrere Modelle mit einem Edelstein
Implementieren Sie eine Freigabeschaltfläche in Rails 6, ohne Gem zu verwenden
Implementieren Sie die Teilübereinstimmungssuchfunktion ohne Ransuck
[Rails] So implementieren Sie einen Unit-Test eines Modells
Lassen Sie uns eine Suchfunktion mit Rails (Ransack) machen
Implementieren Sie die Nachsuchfunktion in der Rails-Anwendung (where-Methode).
[Rails 6.0] Ich habe versucht, eine Tag-Suchfunktion zu implementieren (eine Funktion zum Eingrenzen nach Tags) [no gem]
[Rails] Implementiere die Event-End-Funktion (logisches Löschen) mit Paranoia (Gem)
Bereitstellen einer Suchleiste in Rails ~ Führen Sie eine Suche durch, indem Sie mehrere Tabellen verbinden
[Rails] Suche aus mehreren Spalten + Bedingungen mit Gem und Ransack
Implementierung der Fuzzy-Suchfunktion für Schienen
Suchfunktion mit [Rails] Ransack
[Rails] Erstellen eines Suchfelds
[Rails] Implementieren Sie die Image-Posting-Funktion
[Rails] Eine einfache Möglichkeit, eine Selbsteinführungsfunktion in Ihrem Profil zu implementieren
Ich habe eine Antwortfunktion für die Rails Tutorial-Erweiterung (Teil 1) erstellt.
Ich habe eine Antwortfunktion für die Rails Tutorial-Erweiterung (Teil 5) erstellt:
Rails-API-Modus Ich habe versucht, die Mehrfachsuchfunktion für Schlüsselwörter mithilfe von Arrays und iterativer Verarbeitung zu implementieren.
[Schienen] Listen Sie Instanzen mehrerer Modelle auf
Implementieren Sie eine einfache Anmeldefunktion in Rails
Implementieren Sie eine ähnliche Funktion für Posts
Implementieren Sie ein Kontaktformular in Rails
Implementierung der Funktionsfunktion [Rails] gem ancestry category
Implementieren Sie die CSV-Download-Funktion in Rails
So implementieren Sie eine Diashow mit Slick in Rails (einzeln und mehrfach nacheinander)
[Rails] Ich habe versucht, eine Transaktion zu implementieren, die mehrere DB-Prozesse kombiniert
[Rails] Implementieren Sie die Produktkauffunktion mit einer bei PAY.JP registrierten Kreditkarte
Ich habe eine Antwortfunktion für die Rails Tutorial-Erweiterung (Teil 2) erstellt: Modell ändern