[RUBY] [Rails] Verwenden Sie das Pulldown-Feld, um die Post-Liste nach Datum oder Anzahl der Likes zu sortieren.

Am Anfang

Ich wollte eine Funktion zum Sortieren von Posts nach Datum und Uhrzeit und der Anzahl der Likes in der ursprünglichen Anwendung, daher habe ich es geschafft, sie zu implementieren, während ich ziemlich süchtig war, und werde sie als Memorandum belassen.

Annahme

__ ● Umgebung __ ・ Ruby 2.6-Serie ・ Schienen der Serie 5.2 __ ● Verwendete Bibliothek __ ・ Schlank · Entwickeln __ ● Like-Funktion ist implementiert __ ・ [Rails] Implementierung der Like-Funktion (Slim und Devise werden ebenfalls in diesem Artikel vorgestellt.)

↓ Nach der Montage sieht es so aus ↓

(Es tut mir leid, dass es nicht gut aussieht ...) ezgif.com-video-to-gif.gif

Implementierung

1. Erstellen Sie zunächst ein Pulldown-Formular

h1 Beitragsliste   = form_with model: @post, url: search_path, method: :get, local: true do |form| = form.select :keyword, [ ['Beiträge sind die neuesten', 'new'], ['Beiträge am ältesten', 'old'], ['In absteigender Reihenfolge der Likes', 'likes'], ['In aufsteigender Reihenfolge der Likes', 'dislikes'], ] = form.submit   #================Der Teil, der ursprünglich implementiert wurde========================



 >> __ ・ Lassen Sie uns zusammenfassen, was passiert. __ __

>>```ruby
= form_with model: @post, url: search_path, 
            method: :get, local: true do |form|

__ · `Post model `wird als das im Formular zu verwendende Modell angegeben. Dadurch werden die Daten mit dem Wert "params [: post]" gesendet. __ __

__ ・ Nach der Suche bereiten wir eine Seite für die Anzeige der Suchergebnisse vor. Setzen Sie den Pfad daher auf `` `Suchpfad``` und senden Sie ihn als GET-Anfrage. __ __

__ ・ `` `local: true```. Wenn dies in form_with nicht angegeben ist, wird es als Ajax-Kommunikation betrachtet. Wenn Sie JS nicht verwenden, müssen Sie es hinzufügen, sonst wird es nicht gerendert. __ __

= form.select :keyword, [ ['Beiträge sind die neuesten', 'new'], ['Beiträge am ältesten', 'old'], ['In absteigender Reihenfolge der Likes', 'likes'], ['In aufsteigender Reihenfolge der Likes', 'dislikes'], ] = form.submit



 >> __ ・ Mit der Auswahlmethode können Sie ein Pulldown-Formular erstellen.
 Die Verwendung ist wie `` `select (" Objekt "," Methode "," Auswahl ")` ``. __ __

 >> __ ・ `` `Das erste Argument object``` entspricht dem` `` post object` ``, aber lassen Sie es weg, wenn Sie form_with verwenden. __ __

 >> __ ・ `` `Die zweite Argumentmethode``` ist eine` `Sache, die als Parameter an den`` Controller gesendet wird. Beschreiben Sie sie daher bitte frei. __ __
 __ In diesem Fall wird das Schlüsselwort, da es angegeben ist, als `` `params [: keyword]` `` gesendet. __ __

 >> __ ・ Im Auswahlteil, der das dritte Argument ist,
 ```[ [Wert, der durch Pulldown 1 angezeigt werden soll,An die Aktion gesendete Parameter], 
 [Wert, der im Pulldown-Teil 2 angezeigt werden soll,An die Aktion gesendete Parameter], 
 [Wert, der im Pulldown angezeigt werden soll, Teil 1, An die Aktion gesendete Parameter]] Geben Sie `` `an. __ __

### 2. Bearbeiten Sie das Routing

>```ruby:config/routes.rb
Rails.application.routes.draw do
#================Der Teil, der ursprünglich implementiert wurde========================
  devise_for :users
  resources :users
 
  root to: 'posts#index'
  resources :posts, only: [:index, :new, :create, :show, :edit, :update] do
    resource :favorites, only: [:create, :destroy]
  end
#================Der Teil, der ursprünglich implementiert wurde========================
 
  #Senden Sie Suchergebnisse an die Suchaktion des Posts-Controllers
+ get 'search' => 'posts#search'
 
end

3. Bearbeiten Sie den Posts-Controller

class PostsController < ApplicationController . . . def search selection = params[:keyword] @posts = Post.sort(selection) end . . . end


 >> __ ・ Erstellen Sie eine Suchaktion. In params [: keyword] wird der in der Sortierform ausgewählte Wert empfangen und in einer lokalen Variablen namens selection gespeichert. __ __
 
 >> __ · `sort` ist eine Instanzmethode für Post, nach der sie in der Post-Modellklasse definiert wird, sodass Posts in der Reihenfolge abgerufen werden, in der sie nach dem Wert der Auswahl sortiert sind. __ __

### 4. Definieren Sie die Sortierinstanzmethode im Post-Modell.

>```ruby:app/models/user.rb
class Post < ApplicationRecord
  .
  .
  .
  def self.sort(selection)
    case selection
    when 'new'
      return all.order(created_at: :DESC)
    when 'old'
      return all.order(created_at: :ASC)
    when 'likes'
      return find(Favorite.group(:post_id).order(Arel.sql('count(post_id) desc')).pluck(:post_id))
    when 'dislikes'
      return find(Favorite.group(:post_id).order(Arel.sql('count(post_id) asc')).pluck(:post_id))
    end
  end
  .
  .
  .
end

__ ・ Da es sich um eine Instanzmethodendefinition handelt, wird self hinzugefügt. __ __

__ ・ Die case-Anweisung definiert die Bedingungen für die Sortierung nach dem an die Auswahl übergebenen Wert. __ __

__ ↓ Nach Datum sortieren __

when 'new' return all.order(created_at: :DESC) when 'old' return all.order(created_at: :ASC)


 >> __ ↓ Nach Anzahl der Likes sortieren __

>>```ruby
when 'likes'
   return find(Favorite.group(:post_id).order(Arel.sql('count(post_id) desc')).pluck(:post_id))
when 'dislikes'
   return find(Favorite.group(:post_id).order(Arel.sql('count(post_id) asc')).pluck(:post_id))

__ ・ In Favorite.group (: post_id) gruppiert post_id dieselben Beiträge. __ __

__ · order (Arel.sql ('count (post_id) desc')), count, wie viele user_ids in gruppierten Posts gespeichert sind und nach den meisten sortieren (dh wie viel) Ich zähle, ob es gefällt). __ __ __Arel.sql () ist eine Gegenmaßnahme zur SQL-Injektion. __ __

__ ・ Beim Zupfen (: post_id) wird "post_id selbst" erfasst. Wenn Sie dies nicht beschreiben, wird der entsprechende Fund, der für Post aufgerufen wird, nicht gefunden und es tritt ein Fehler auf. __ __

_ * Derzeit wird das Problem, dass Beiträge mit 0 Likes nicht angezeigt werden, nicht unterstützt. Es tut mir Leid…. Ich werde es hinzufügen, sobald es gelöst ist. _

5. Zeigen Sie die Ansicht der Suchergebnisse an

h1 Suchergebnisse   = form_with url: search_path, method: :get, local: true do |form| = form.select :keyword, [ ['Beiträge sind die neuesten', 'new'], ['Beiträge am ältesten', 'old'], ['In absteigender Reihenfolge der Likes', 'likes'], ['In aufsteigender Reihenfolge der Likes', 'dislikes'], ] = form.submit


 >> __ ・ Erstellen Sie eine setatch.html.slim-Datei im Verzeichnis app / views / posts und beschreiben Sie sie wie oben beschrieben. __ __
 
 >> __ ・ Der hier beschriebene Inhalt ist genau der gleiche wie der in posts / index.html.slim beschriebene Inhalt, daher wird er parteiisiert. __ __

### 

 

>```ruby:app/views/posts/_select_form.html.slim
= form_with model: @post, url: search_path, method: :get, local: true do |form|
  = form.select :keyword, [ ['', 'new'],
                            ['', 'old'],
                            ['', 'likes'],
                            ['', 'dislikes'],
                          ]
  = form.submit

__6-1. Partialisierung des Suchformulars __Posts neueste Posts Älteste Posts Most Likes Bestellungen Weniger Likes >> __ · Im Verzeichnis app / views / posts _select_form. Erstellen Sie eine html.slim-Datei und portieren Sie den gesamten Pulldown-Menücode. __ __

__6-2. Partialisierung der Postliste & Suchergebnisliste __


 >> __ ・ Erstellen Sie eine `_result.html.slim`-Datei im Verzeichnis app / views / posts und portieren Sie den gesamten Code für die Anzeige der Post-Liste. __ __

 > #### __6-3. In jede Ansicht rendern __

>```ruby:app/views/posts/index.html.slim
h1 Beitragsliste
 
= render 'select_form'
 
= render 'result'

h1 Suchergebnisse   = render 'select_form'   = render 'result'


#### das ist alles.


## Schließlich
 Damit ist die Implementierung der Sortierfunktion abgeschlossen!
 Um ehrlich zu sein, bin ich in vielen Bereichen nicht zuversichtlich, daher würde ich mich sehr freuen, wenn Sie mir etwas Falsches sagen könnten!

## Artikel, der sehr hilfreich war
 [Wie implementiere ich eine Suchfunktion ohne Edelstein? Unterstützt mehrere Tabellen! ](Https://prokyou.com/rails/nogemsearch/)
 [[Rails] Verwendung von select zum Erstellen eines Auswahlfelds mit einem vollständigen Verständnisformular](https://310nae.com/rails-selectbox/)
[select (ActionView::Helpers::FormOptionsHelper) - APIdock](https://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/select)


Recommended Posts

[Rails] Verwenden Sie das Pulldown-Feld, um die Post-Liste nach Datum oder Anzahl der Likes zu sortieren.
[Enum] Verwenden Sie Rails Enum, um die Lesbarkeit von Daten zu verbessern
[Rails] Registrieren Sie sich mit Devise nach Attributen desselben Modells
Bei Verwendung des Konstruktors der Date-Klasse von Java wird das Datum um 1900 vorverlegt.
[Rails] So zeigen Sie eine Liste der Beiträge nach Kategorie an
Sortieren Sie nach der Anzahl der Likes und der Seitennation
So sortieren Sie eine Liste von SelectItems
[Rails] Implementierung des PV-Nummernrankings mit Impressionist
Eine Überprüfung des von Rails-Anfängern verwendeten Codes
[Java] Sortieren Sie die Liste mit Streams und Lambda-Ausdrücken
Finden Sie den Rest geteilt durch 3, ohne eine Zahl zu verwenden
Rails6: Geben Sie die Anfangsdaten von ActionText mit seed ein
Ausgabe des Tages mit der Ruby's Date-Klasse
Begrenzen Sie die Anzahl der Threads mithilfe des Java Executor Service
Versuchen Sie es mit dem Ruby on Rails-Abfrageattribut