2017-03-26 2 views
1

Ich habe eine Tabelle Artikel mit Ranking-Modell eingestuft. Einige dieser Datensätze haben einen booleschen Wert.Wie erhält man nur Datensätze zwischen zwei Bedingungen in der Reihenfolge mit Ruby On Rails?

Das Element mit dem Booleschen Wert sollte als Titel des Abschnitts fungieren, und die Elemente, die nach ihm geordnet sind, sind das Element des Abschnitts bis zum nächsten Booleschen, der einen anderen Abschnitt darstellt.

Wie kann ich Schleifen von jeder Sitzung (Element mit Boolean True) und nächste Elemente in Reihenfolge machen?

In dem Controller hinzugefügt I

@sections = Item.where(title: true).rank(:row_order) 

Jetzt weiß ich nicht, wie nur nach jedem Abschnitten werden die Einzelteile zu erhalten und vor der nächsten

Jede Hilfe sehr geschätzt wird

Dank

+0

Welche 2 Bedingungen werden Sie durch die Abfrage versuchen? –

+0

Abschnitte sind Elemente mit Titel wahr, dann muss ich Elemente abfragen, die Titel falsch sind und zwischen 2 Abschnitt (Artikel mit Titel wahr) – Daniele

+0

Ich empfehle, Datenbank Normalisierung zuerst durchführen, 2 Tabellen - 'TitleItem' und' Item', wo Der Artikel gehört zu title_item. Dies könnte sogar eine selbst verbundene Tabelle sein, in der Artikel den Schlüssel section_id haben. – MikDiet

Antwort

1

Sie können alle Elemente in der richtigen Reihenfolge abrufen und slice_before für diese Sammlung verwenden, indem Sie das boolesche Attribut verwenden. Die Bestellung erfolgt nach Ranking-Modell in Ihrem Setup, wenn ich das richtig verstanden habe.

Für ein lauffähiges Beispiel verwende ich eine Struct anstelle einer ActiveRecord Klasse.

Item = Struct.new(:name, :is_title) 
items = [ 
    Item.new('title 1', true ), 
    Item.new('item 1.1', false), 
    Item.new('item 1.2', false), 
    Item.new('item 1.3', false), 
    Item.new('item 1.4', false), 
    Item.new('item 1.5', false), 
    Item.new('item 1.6', false), 
    Item.new('title 2', true ), 
    Item.new('title 3', true ), 
    Item.new('item 3.1', false), 
    Item.new('title 4', true ), 
    Item.new('item 4.1', false), 
    Item.new('item 4.2', false), 
    Item.new('item 4.3', false), 
] 

items_per_chapter = items.slice_before{ |item| item.is_title } 
items_per_chapter.each do |items| 
    puts '----------' 
    items.each do |item| 
    puts item.name 
    end 
end 

Dies schreibt folgendes stdout:

---------- 
title 1 
item 1.1 
item 1.2 
item 1.3 
item 1.4 
item 1.5 
item 1.6 
---------- 
title 2 
---------- 
title 3 
item 3.1 
---------- 
title 4 
item 4.1 
item 4.2 
item 4.3 
+0

danke. Genau das habe ich gesucht! – Daniele

Verwandte Themen