Sqlite3 activerecord: order => "time DESC" не сортируется - PullRequest
4 голосов
/ 27 апреля 2010

рельсы 2.3.4, sqlite3

Я пытаюсь это

Production.find (: все,: условия => ["время>?", start_time.utc],: order => "time DESC", : предел => 100)

Условие работает отлично, но у меня проблемы с : order => time DESC .

Случайно я обнаружил, что он работает на Heroku (тестирование с консолью heroku), которая запускает PostgreSQL. Однако локально, с использованием sqlite3, новые записи будут отсортированы по старым, независимо от того, какое значение я установил для time . Вот так ( вывод был удален вручную ): вторая запись новая:

Идентификатор производства: 2053939460, время: "2010-04-24 23:00:04", create_at: "2010-04-24 23:00:05"

Идентификатор производства: 2053939532, время: "2010-04-25 10:00:00", create_at: "2010-04-27 05:58:30"

Идентификатор производства: 2053939461, время: "2010-04-25 00:00:04", create_at: "2010-04-25 00:00:04"

Идентификатор производства: 2053939463, время: "2010-04-25 01:00:04", create_at: "2010-04-25 01:00:04"

Похоже, что сортируется по первичному ключу, id , а не time . Обратите внимание, что запрос отлично работает на герою, возвращая правильно упорядоченный список! Мне нравится sqlite, это так ПОЦЕЛУЙ, надеюсь, ты поможешь мне ...

Есть предложения?


UPDATE / РЕШИТЬ: time - зарезервированное ключевое слово sqlite3 ( date , среди прочего, тоже). Вот почему :order => 'time DESC' работает в PostgreSQL ( незарезервированное ключевое слово ), но не в sqlite3. Решение состоит в том, чтобы избежать использования ключевых слов sqlite3 в качестве имен столбцов, если вы когда-либо намереваетесь сортировать их. Переименование решает проблему.

Я протестировал со стандартным шаблоном рельсов updated_at и create_at , который отлично работает.

Я все еще предпочитаю sqlite3 в разработке, с ним так просто и гладко работать, копировать базу данных и отправлять партнеру. Благодаря @newtover!

1 Ответ

5 голосов
/ 27 апреля 2010

Обычно плохая идея использовать зарезервированные слова без кавычек.time - это встроенная функция в SQLite, попробуйте вместо этого использовать следующее и, во-первых, лучше избавиться от неоднозначности:

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

UPD : похоже, проблемапоявилось на SO:

Rails Active Record находят (: all,: order =>) проблему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...