代码之家  ›  专栏  ›  技术社区  ›  oma

sqlite3 activerecord:order=>“time desc”不排序

  •  4
  • oma  · 技术社区  · 14 年前

    轨道2.3.4,sqlite3

    我在试这个

    生产。查找(:all,:conditions=>[“time”>?), 开始时间.utc],:order=>“时间描述”, :限制=>100)

    这个 条件 很好,但我有问题 :order=>时间描述 .

    碰巧,我发现它在运行postgresql的heroku(heroku控制台测试)上工作。但是,在本地,使用sqlite3, 新条目 不管我设置了什么,都会按照旧的分类 时间 去。像这样( 输出已被手动剥离 ):第二个条目是新的:

    生产编号:2053939460,时间:“2010-04-24 23:00:04”,创建时间:“2010-04-24 23:00:05”

    生产编号:2053939532,时间:“2010-04-25 10:00:00”,创建时间:“2010-04-27 05:58:30”

    生产编号:2053949461,时间:“2010-04-25 00:00:04”,创建时间:“2010-04-25 00:00:04”

    生产编号:2053949463,时间:“2010-04-25 01:00:04”,创建时间:“2010-04-25 01:00:04”

    好像是按主键排序的, 身份证件 不是 时间 . 注意,该查询在heroku上运行良好,返回了一个正确排序的列表!我喜欢sqlite,它是如此的吻,我希望你能帮助我…

    有什么建议吗?


    更新/解决: 时间 是保留的sqlite3关键字( 日期 ,其中也包括)。这就是为什么 :order => 'time DESC' 在PostgreSQL工作( non-reserved keyword ),但不在sqlite3中。解决方案是,如果您想对sqlite3关键字进行排序,就避免将其作为列名。 重命名解决了这个问题。

    我已经用标准的rails模式测试过了 更新的AT 创造在 ,效果很好。

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

    1 回复  |  直到 13 年前
        1
  •  5
  •   Community CDub    7 年前

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

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

    UPD :问题似乎是这样出现的:

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