4

导轨 2.3.4,sqlite3

我正在尝试这个

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

条件完美,但我遇到了:order => time 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排序,而不是time。请注意,查询在 heroku 上运行良好,返回正确排序的列表!我喜欢sqlite,它是如此的KISS,希望你能帮助我...

有什么建议么?


更新/解决: time是一个保留的 sqlite3 关键字(date等也是)。这就是为什么:order => 'time DESC'在 PostgreSQL(非保留关键字)中有效,但在 sqlite3 中无效的原因。如果您打算对它们进行排序,解决方案是避免将 sqlite3 关键字作为列名。重命名解决了这个问题。

我已经使用标准 rails 模式updated_atcreated_at进行了测试,效果很好。

在开发中我还是更喜欢 sqlite3,它使用起来非常简单流畅,复制数据库并发送给您的合作伙伴。感谢@newtover!

4

1 回答 1

5

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

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

UPD:问题似乎出现在 SO:

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

于 2010-04-27T09:34:02.057 回答