Sqlite3 activerecord:order => “时间DESC”没有排序

时间:2010-04-27 09:11:13

标签: ruby-on-rails sqlite reserved-words

rails 2.3.4,sqlite3

我正在尝试这个

  

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

条件完美无缺,但我遇到了:order =>的问题时间DESC

偶然的机会,我发现它在运行PostgreSQL的Heroku(用heroku控制台测试)上运行。但是,在本地,使用sqlite3,新条目将在旧版本之后进行排序,无论我将时间设置为什么。像这样(输出已被手动剥离):第二个条目是新的:

  

生产ID:2053939460,时间:“2010-04-24 23:00:04”,created_at:“2010-04-24 23:00:05”

     

生产ID:2053939532,时间:“2010-04-25 10:00:00”,created_at:“2010-04-27 05:58:30”

     

生产ID:2053939461,时间:“2010-04-25 00:00:04”,created_at:“2010-04-25 00:00:04”

     

生产ID:2053939463,时间:“2010-04-25 01:00:04”,created_at:“2010-04-25 01:00:04”

好像它在主键上排序, id ,而不是时间。请注意,查询在heroku上运行正常,返回正确排序的列表!我喜欢sqlite,它是如此亲吻,我希望你能帮助我......

有什么建议吗?


UPDATE /解决: time 是一个保留的sqlite3关键字( date ,其中也是如此)。这就是:order => 'time DESC'在PostgreSQL(non-reserved keyword)中工作的原因,而不是在sqlite3中。解决方案是避免将sqlite3关键字用作列名,如果您打算对它们进行排序的话。 重命名可以解决问题。

我已经使用标准导轨模式 updated_at created_at 进行了测试,效果非常好。

我仍然喜欢开发中的sqlite3,使用起来非常简单顺畅,复制数据库并发送给你的合作伙伴。感谢@newtover!

1 个答案:

答案 0 :(得分:5)

使用保留字而不包含引号通常是个坏主意。 time是SQLite中的内置函数,请尝试使用以下代码,并首先更好地消除歧义:

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

UPD :问题似乎出现在SO:

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