Hallo,
ich bin auf eine seltsame Abfrage gestoßen, bei der ich nicht recht weiß, wie ich sie nur mit einer SQL-/Active-Record-Abfrage lösen soll.
Ich habe Themen mit benutzerdefinierten Feldern und muss die Daten anhand des Wertes des benutzerdefinierten Feldes ‘importedSortDate’ sortieren.
Ursprünglicher Code:
Topic.where(‘category_id in (?)’, [cat_id])
.where(‘closed = ?’, false)
.order(‘created_at desc’)
.limit(10)
Wie kann ich diese Abfrage so ändern oder ergänzen, dass ich nur diese 10 Themen in den Speicher lade und nicht mehr?
Da das Template für die Tabelle der benutzerdefinierten Felder etwas ungewöhnlich ist – im Sinne von, dass es eine Spalte für den Namen und eine für den Wert gibt –, bin ich etwas ratlos, wie ich das alles genau über die Datenbankabfrage bewerkstelligen soll.
Mein Problem beim Laden mehrerer Datensätze in den Speicher ist, dass für jedes geladene Thema zusätzlich ein Abruf der Kategorie, des Benutzers und des Beitrags durchgeführt wird.
Ich arbeite mit 1.000 bis 2.000 Themen pro Kategorie und habe vier Kategorien, aus denen ich abrufen muss. Der Abruf wird von allen Nutzern durchgeführt, es ist also keine einmalige Aktion.
Soweit ich das sehe, habe ich bisher zwei Möglichkeiten (die erste scheint für mich nicht schnell genug zu sein):
- Nur die IDs aller Themen abrufen, die mich interessieren (in einem Abruf), dann diese Information irgendwie mit dem Wert von ‘importedSortDate’ verknüpfen, dann in den Speichersortieren und anschließend erneut die IDs in der gleichen Reihenfolge abrufen (ich weiß auch hier nicht genau, wie das funktionieren würde).
- Eine Abfrage erstellen, die mit der Tabelle der benutzerdefinierten Felder verknüpft wird (ich habe einige Beispiele gesehen, diese bezogen sich jedoch auf feste Werte in den Spalten ‘name’ und ‘value’) und alles basierend auf den Spalten ‘name’ === ‘importedSortDate’ und der Wertespalte (ISO8601-Zeichenkette) sortieren.
Wie kann ich das erreichen?
PS: Manche Themen haben möglicherweise keinen Wert im benutzerdefinierten Feld ‘importedSortDate’. In diesem Fall könnte ich diese einfach abrufen und beliebig platzieren, was ein Randfall ist, mit dem ich umgehen kann. Wenn sie keinen Wert haben, sollten sie die ersten Einträge sein.
PPS: Ich möchte diese Abfrage später als meine Paginierungsabfrage verwenden. Die Logik dafür ist bereits implementiert; ich muss nur die Hauptabfrage zum Abrufen der Themen anpassen.