[RUBY] [Rails] Funktion zum Suchen und Auflisten von Produkten aus mehrstufigen Kategorien

Überblick

Wie in der Abbildung unten gezeigt, ist es eine Funktion, eine Liste der Produkte anzuzeigen, die zur ausgewählten Kategorie gehören. Die Kategorien sind mehrstufig und je niedriger die Ebene, desto enger wird die Suche. Kategorien werden anhand der Abstammung von Edelsteinen erstellt. d3a7f46ab307f384f41fe88f3917826b.gif

Annahme

Die App in diesem Artikel verwendet drei Kategorienebenen. In diesem Artikel ist die oberste Kategorie die "übergeordnete Kategorie" und die darunter liegende Hierarchie die "untergeordnete Kategorie". Darunter wird die "Enkelkategorie" ausgedrückt.

Referenzartikel

Die folgenden Artikel sind hilfreich für die Installation von Abstammung. https://qiita.com/Sotq_17/items/120256209993fb05ebac https://qiita.com/pdm21/items/fe0055b3190af790f1c0

Implementierung

Kategorielistenseite

Zuerst erstellen wir eine Listenseite, auf der alle Kategorien angezeigt werden. Verwenden Sie die Indexaktion des Categories Controllers. bda976886433b175ea19e2cecab7afa1.png

Definition der Indexaktion

app/controllers/categories_controller.rb


def index
  @parents = Category.where(ancestry: nil)
end

Da die Abstammungsspalte der übergeordneten Kategorie Null ist, können Sie die übergeordnete Kategorie mit der obigen Beschreibung abrufen.

Erstellung anzeigen

app/views/categories/index.html.haml


%h1 Kategorieliste
%ul.categories
  - @parents.each do |parent|
    %li.parents= link_to "#{parent.name}", category_path(parent)
    
    %ul.categories__children
      - parent.children.each do |child|
        %li.childern= link_to "#{child.name}", category_path(child)

        %ul.categories__grandchildren
          - child.children.each do |grandchild|
            %li= link_to "#{grandchild.name}", category_path(grandchild)

Sie können jetzt alle Kategorien auflisten. Jeder Kategoriename ist nach der später beschriebenen Kategorie mit der Produktlistenseite verknüpft.

Produktliste Seite für Kategorie

Als Nächstes erstellen wir eine Seite, auf der die Produkte aufgelistet sind, die zur ausgewählten Kategorie gehören. Verwenden Sie die Show-Aktion des Categories-Controllers.

Aktionsdefinition anzeigen

app/controllers/categories_controller.rb


before_action :set_category, only: :show

def show
  @items = @category.set_items
  @items = @items.where(buyer_id: nil).order("created_at DESC").page(params[:page]).per(9)
end

private
def set_category
  @category = Category.find(params[:id])
end

Verwenden Sie die Modellmethode set_items, die später beschrieben wird, um die Produkte in der Kategorie abzurufen.

Definition der Modellmethode

app/models/category.rb


has_many :items
has_ancestry

def set_items
  #Für übergeordnete Kategorie
  if self.root?
    start_id = self.indirects.first.id
    end_id = self.indirects.last.id
    items = Item.where(category_id: start_id..end_id)
    return items

    #Für untergeordnete Kategorien
  elsif self.has_children?
    start_id = self.children.first.id
    end_id = self.children.last.id
    items = Item.where(category_id: start_id..end_id)
    return items

    #Für Enkelkategorie
  else
    return self.items
  end
end

Die ID der Enkelkategorie ist in der Kategorie-ID des Produkts registriert. Wenn Sie also einfach @items = @ category.items schreiben, können Sie die Produktinformationen nur erhalten, wenn @category ein Enkel ist. Daher wird, wie oben beschrieben, eine bedingte Verzweigung durchgeführt, abhängig davon, welchem Elternteil, Kind oder Enkel die Kategorie entspricht. Wenn es sich bei der Kategorie um ein Elternteil oder ein Kind handelt, wird das Produkt durch Angabe des ID-Bereichs der Enkelkategorie erworben, deren Eigentümer es ist.

Die folgenden Artikel sind hilfreich, wenn Sie Abstammungs-spezifische Methoden wie root? Und indirekte verwenden. https://qiita.com/Rubyist_SOTA/items/49383aa7f60c42141871

Erstellung anzeigen

app/views/categories/show.html.haml


.products-container
  .products-index
    .title
      = "#{@category.name}Produktliste"
      .title__border
    - if @items
      %ul.lists
        = render "items/item", items: @items
    = paginate @items

Die auf allen Produktlistenseiten verwendete Teilvorlage wird freigegeben. Der angezeigte Inhalt wird entsprechend dem Wert von @items geändert.

Erstellen Sie Links zu anderen Kategorien

Fügen Sie abschließend wie unten gezeigt Links zu anderen Kategorien hinzu, um das Auffinden von Produkten zu erleichtern. 4f5519ec96f8863baa48a2f49dd17281.png Wenn die Anzeigekategorie übergeordnet oder untergeordnet ist, verknüpfen Sie die Kategorie mit einer Ebene darunter. Zeigen Sie für Enkelkinder Links zu Enkelkategorien an, die zur selben untergeordneten Kategorie gehören.

app/controllers/categories_controller.rb


def set_category
  @category = Category.find(params[:id])
  #Nachtrag---------------------------------
  if @category.has_children?
    @category_links = @category.children
  else
    @category_links = @category.siblings
  end
  # -------------------------------------
end

app/views/categories/show.html.haml



//Nachtrag--------------------------------------------------
.category_wrapper
  .category_links
    - @category_links.each do |category|
      = link_to category.name, category_path(category)
// -----------------------------------------------------
.products-container
  .products-index
    .title
      = "#{@category.name}Produktliste"
      .title__border
    - if @items
      %ul.lists
        = render "items/item", items: @items
    = paginate @items

Wenn Sie das CSS danach entsprechend anordnen, wird es abgeschlossen.

Schließlich

Damit ist die Funktion zum Suchen nach Produkten aus mehrstufigen Kategorien abgeschlossen. Vielen Dank, dass Sie so weit gelesen haben.

Recommended Posts

[Rails] Funktion zum Suchen und Auflisten von Produkten aus mehrstufigen Kategorien
Implementierung der Fuzzy-Suchfunktion für Schienen
[Schienen] Implementieren Sie die Benutzersuchfunktion
Suchfunktion mit [Rails] Ransack
[Rails] Suche aus mehreren Spalten + Bedingungen mit Gem und Ransack
Fügen Sie eine Suchfunktion in Rails hinzu.
[Java] Konvertierung von Array zu Liste
Rails-API-Modus Ich habe versucht, die Mehrfachsuchfunktion für Schlüsselwörter mithilfe von Arrays und iterativer Verarbeitung zu implementieren.
Strict_loading-Funktion zur Unterdrückung des Auftretens von N + 1-Problemen, die von Schienen hinzugefügt wurden 6.1
Rails Tutorial-Datensatz und Memorandum Nr. 1 "Von der Installation bis zur Bereitstellung von hello_app + Fehlerbehandlung"
Vom Ziehen des Docker-Images der Schienen bis zum Starten
[Ruby on Rails] Suchfunktion (nicht ausgewählt)
So implementieren Sie Suchfunktionen in Rails
Installieren Sie Webpacker und Yarn, um Rails auszuführen
[Rails] Wie man von erb zu haml konvertiert
Schienen Hinzufügen einer einfachen Anmeldefunktion
[Rails] Zuweisen von Variablen vom Controller zu JavaScript
[Rails] [Hinweis] Wann = zu <%%> hinzugefügt werden soll und wann nicht
Verwenden Sie Stream # collect, um nur bestimmte Felder aus einer Java Bean-Liste abzurufen und aufzulisten