4 Stimmen

Sqlite3 activerecord :order => "time DESC" sortiert nicht

Schienen 2.3.4, sqlite3

Ich probiere das aus

Production.find(:all, :conditions => ["time > ?", start_time.utc], :order => "time DESC", :limit => 100)

En condición funktioniert perfekt, aber ich habe Probleme mit dem :order => time DESC .

Zufällig entdeckte ich, dass es bei Heroku funktioniert (Test mit der Heroku-Konsole), wo PostgreSQL läuft. Allerdings, lokal, mit sqlite3, neue Einträge werden nach den alten sortiert, egal was ich einstelle Zeit zu. Etwa so ( die Ausgabe wurde manuell entfernt ): Der zweite Eintrag ist neu:

Production id: 2053939460, time: "2010-04-24 23:00:04", created_at: "2010-04-24 23:00:05"

Produktionsnummer: 2053939532, Uhrzeit: "2010-04-25 10:00:00", created_at: "2010-04-27 05:58:30"

Produktionsnummer: 2053939461, Uhrzeit: "2010-04-25 00:00:04", created_at: "2010-04-25 00:00:04"

Produktions-ID: 2053939463, Zeit: "2010-04-25 01:00:04", created_at: "2010-04-25 01:00:04"

Sieht aus, als würde sie nach dem Primärschlüssel sortieren, id no Zeit . Beachten Sie, dass die Abfrage funktioniert gut auf heroku, die Rückgabe eine korrekt geordnete Liste! Ich mag sqlite, es ist so KISS, ich hoffe, Sie können mir helfen...

Irgendwelche Vorschläge?


UPDATE/GELÖST: Zeit ist ein reserviertes sqlite3-Schlüsselwort ( Datum unter anderem auch). Aus diesem Grund :order => 'time DESC' funktioniert in PostgreSQL ( nicht-reserviertes Schlüsselwort ), aber nicht in sqlite3. Die Lösung besteht darin, sqlite3-Schlüsselwörter als Spaltennamen zu vermeiden, wenn Sie jemals beabsichtigen, nach ihnen zu sortieren. Durch Umbenennung wird das Problem gelöst.

Ich habe mit dem Standardschienenmuster getestet aktualisiert_am y erstellt_am was perfekt funktioniert.

Ich bevorzuge immer noch sqlite3 in der Entwicklung, es ist so einfach und reibungslos zu arbeiten, kopieren Sie die Datenbank und senden Sie an Ihren Partner. Danke an @newtover !

5voto

newtover Punkte 29616

Es ist in der Regel keine gute Idee, reservierte Wörter ohne Anführungszeichen zu verwenden. time eine eingebaute Funktion in SQLite ist, versuchen Sie stattdessen die folgende zu verwenden, um die Zweideutigkeit von vornherein zu beseitigen:

Production.find(:all,
                :conditions => ["`time` > ?", start_time.utc],
                :order => "`time` DESC",
                :limit => 100)

UPD : Das Problem scheint bei SO aufgetreten zu sein:

Rails Active Record find(:all, :order => ) Ausgabe

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X