Frage Rails Active Record find (: alle,: Reihenfolge =>) Problem


Es scheint, dass ich die Option ActiveRecord :: Base.find nicht verwenden kann: Reihenfolge für mehr als eine Spalte gleichzeitig.

Zum Beispiel habe ich ein "Show" -Modell mit Datum und Teilnahme an Spalten.

Wenn ich den folgenden Code ausführen:

@shows = Show.find(:all, :order => "date")

Ich bekomme folgende Ergebnisse:

[#<Show id: 7, date: "2009-04-18", attending: 2>, 
 #<Show id: 1, date: "2009-04-18", attending: 78>, 
 #<Show id: 2, date: "2009-04-19", attending: 91>, 
 #<Show id: 3, date: "2009-04-20", attending: 16>,
 #<Show id: 4, date: "2009-04-21", attending: 136>]

Wenn ich den folgenden Code ausführen:

@shows = Show.find(:all, :order => "attending DESC")

[#<Show id: 4, date: "2009-04-21", attending: 136>,
 #<Show id: 2, date: "2009-04-19", attending: 91>,
 #<Show id: 1, date: "2009-04-18", attending: 78>,
 #<Show id: 3, date: "2009-04-20", attending: 16>,
 #<Show id: 7, date: "2009-04-18", attending: 2>]

Aber wenn ich renne:

@shows = Show.find(:all, :order => "date, attending DESC")

ODER

@shows = Show.find(:all, :order => "date, attending ASC")

ODER

@shows = Show.find(:all, :order => "date ASC, attending DESC")

Ich bekomme die gleichen Ergebnisse wie nur nach Datum sortieren:

 [#<Show id: 7, date: "2009-04-18", attending: 2>, 
 #<Show id: 1, date: "2009-04-18", attending: 78>, 
 #<Show id: 2, date: "2009-04-19", attending: 91>, 
 #<Show id: 3, date: "2009-04-20", attending: 16>,
 #<Show id: 4, date: "2009-04-21", attending: 136>]

Wo, wie möchte ich diese Ergebnisse erhalten:

[#<Show id: 1, date: "2009-04-18", attending: 78>,
#<Show id: 7, date: "2009-04-18", attending: 2>, 
 #<Show id: 2, date: "2009-04-19", attending: 91>, 
 #<Show id: 3, date: "2009-04-20", attending: 16>,
 #<Show id: 4, date: "2009-04-21", attending: 136>]

Dies ist die Abfrage, die aus den Protokollen generiert wird:

[4;35;1mUser Load (0.6ms)[0m   [0mSELECT * FROM "users" WHERE ("users"."id" = 1) LIMIT 1[0m
[4;36;1mShow Load (3.0ms)[0m   [0;1mSELECT * FROM "shows" ORDER BY date ASC, attending DESC[0m
[4;35;1mUser Load (0.6ms)[0m   [0mSELECT * FROM "users" WHERE ("users"."id" = 1) [0m

Endlich, hier ist mein Modell:

  create_table "shows", :force => true do |t|
    t.string   "headliner"
    t.string   "openers"
    t.string   "venue"
    t.date     "date"
    t.text     "description"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.decimal  "price"
    t.time     "showtime"
    t.integer  "attending",   :default => 0
    t.string   "time"
  end

Was vermisse ich? Was mache ich falsch?

UPDATE: Danke für all deine Hilfe, aber es scheint, dass ihr alle genauso ratlos war wie ich. Was das Problem löste, war das Wechseln der Datenbanken. Ich wechselte vom Standard sqlite3 zu mysql. 


75
2018-04-13 00:25


Ursprung


Antworten:


Ich bemerke das in deinem ersten Beispiel das Einfache : Reihenfolge => "Datum", Aufzeichnung 7 ist vor dem Datensatz sortiert 1. In dieser Reihenfolge sehen Sie auch die Ergebnisse in der mehrspaltigen Sortierung, unabhängig davon, ob Sie sortieren, indem Sie teilnehmen.

Dies scheint mir einen Sinn zu ergeben, wenn die Daten nicht genau übereinstimmen und das Datum für 7 ist vor dem Datum für 1. Anstatt zu finden, dass die Datums sind genau gleich dann weiter nach sortieren teilnehmen, die Abfrage findet, dass die Daten nicht gleich sind und einfach wie alle anderen Datensätze sortiert.

Ich sehe aus dem Umblättern, dass SQLite kein natives Verständnis von Datentypen DATE oder DATETIME hat und stattdessen Benutzern die Wahl von Fließkommazahlen oder Text gibt, die sie selbst analysieren müssen. Ist es möglich, dass die wörtliche Darstellung der Daten in der Datenbank nicht exakt gleich ist? Die meisten Leute scheinen das zu müssen Verwenden Sie Datumsfunktionen damit sich Daten so verhalten, wie Sie es erwarten würden. Vielleicht gibt es eine Möglichkeit, Ihre Bestellung nach Spalten mit einem Datumsfunktion das wird dir etwas Konkretes zum Vergleich geben, wie Datum (Datum) ASC, Teilnahme an DESC. Ich bin mir nicht sicher, ob die Syntax funktioniert, aber es ist ein Bereich, den man sich ansehen sollte, um sein Problem zu lösen. Ich hoffe, das hilft.


36
2018-04-13 16:36



Könnte zwei Dinge sein. Zuerst,

Dieser Code ist veraltet:

Model.find(:all, :order => ...)

sollte sein:

Model.order(...).all

Suchen wird nicht mehr mit den Optionen: all,: order und vielen anderen Optionen unterstützt.

Zweite, Möglicherweise hatten Sie ein default_scope, das eine Bestellung erzwang, bevor Sie angerufen haben find auf Show.

Stundenlanges Suchen im Internet führte mich zu einigen nützlichen Artikeln, die das Problem erklären:


44
2018-01-14 02:49



Das Problem ist, dass Datum ist ein reserviertes sqlite3 Schlüsselwort. Ich hatte ein ähnliches Problem mit Zeit, auch ein reserviertes Schlüsselwort, das in PostgreSQL funktioniert, aber nicht in sqlite3. Die Lösung besteht darin, die Spalte umzubenennen.

Sieh dir das an: Sqlite3 activerecord: order => "time DESC" sortiert nicht


14
2018-04-28 10:52



Ich habe gerade das gleiche Problem, aber ich habe es geschafft, meine Abfrage in SQLite wie folgt arbeiten:

@shows = Show.order("datetime(date) ASC, attending DESC")

Ich hoffe, dass dies jemandem helfen könnte, etwas Zeit zu sparen


4
2018-02-13 21:44



ist es nicht nur :order => 'column1 ASC, column2 DESC'?


3
2018-04-13 00:46



Stellen Sie sicher, dass Sie das Schema auf Datenbankebene direkt überprüfen. Ich habe mich zuvor schon verbrannt, wo zum Beispiel eine Migration ursprünglich geschrieben wurde, um eine: datetime-Spalte zu erstellen, und ich habe sie lokal ausgeführt, dann habe ich die Migration auf ein Datum vor der eigentlichen Bereitstellung optimiert. Daher sieht die Datenbank für alle gut aus, außer für meine, und die Fehler sind subtil.


3
2018-04-15 22:39



Ich verstehe, warum die Rails-Entwickler mit sqlite3 für eine Out-of-the-Box-Implementierung gingen, aber MySQL ist so viel praktischer, IMHO. Ich weiß, es hängt davon ab, wofür Sie Ihre Rails-App erstellen, aber die meisten Leute werden die Standard-Datei "database.yml" von sqlite3 auf MySQL umstellen.

Froh, dass du dein Problem gelöst hast.


2
2018-04-18 21:34



Es ist gut, dass Sie Ihre Lösung gefunden haben. Aber es ist ein interessantes Problem. Ich habe es direkt mit sqlite3 ausprobiert (nicht über Schienen) und habe nicht das selbe Ergebnis bekommen, für mich kam der Auftrag wie erwartet heraus.

Was ich Ihnen vorschlage, wenn Sie dieses Problem weiter vertiefen möchten, ist das Starten der sqlite3-Befehlszeilenanwendung und das Überprüfen des Schemas und der Abfragen dort:

Dies zeigt dir das Schema: .schema

Führen Sie dann die select-Anweisung aus, wie sie in den Protokolldateien angezeigt wird: SELECT * FROM "shows" ORDER BY date ASC, attending DESC

So sehen Sie, wenn:

  1. Das Schema sieht so aus, wie Sie es wollen (dieses Datum ist beispielsweise ein Datum)
  2. Dass die Datumsspalte tatsächlich ein Datum und keinen Zeitstempel enthält (das heißt, dass Sie keine Zeit des Tages haben, die die Sortierung durcheinander bringt)

2
2018-04-21 08:33



Dies könnte auch helfen:

Post.order(created_at: :desc)

0
2017-07-22 18:35