【问题标题】:Rails :order by date in Postgres returning incorrect orderRails:在Postgres中按日期排序返回不正确的顺序
【发布时间】:2012-10-06 23:28:21
【问题描述】:

我有一个名为Story 的型号,我正试图在created_at 日期之前订购。由于我在使用 Postgresql 的 Heroku 上托管了我的应用程序,因此我的控制器中有以下内容:

@stories = Story.find( :all, :order => "DATE(created_at) DESC" , :limit => 11)

我希望这会给出我的前 11 个故事,按创建日期排序,最新的故事在前。

很遗憾,这不起作用。大多数故事都按正确顺序返回,但前两个故事颠倒了。也就是说,最新的报道出现在列表的第二位。

为什么会这样?我有一个偷偷摸摸的怀疑,我的结果根本没有排序,或者被排序在错误的列上(也许是 id?),并且直到现在它恰好按照我在索引页面上显示时的预期排序。我怎样才能按我的预期订购它?

万一有人关心,索引视图只是按顺序显示故事。那就是(HAML):

- @stories.each do |story|
  = render :partial => "event", :locals => { :event => story }

编辑

我怀疑created_at 是一个日期时间列,而DATE(...) 函数忽略了时间部分。因此它以随机顺序返回在同一日期创建的元素。由于前两个故事是在同一天创建的,但相隔几个小时,这可以解释为什么它们似乎是“颠倒的”。如果是这种情况,按日期和时间排序的正确语法是什么?

【问题讨论】:

  • 另请注意,默认情况下,在 PostgreSQL 中,“空值排序为好像大于任何非空值;也就是说,NULLS FIRSTDESC 顺序的默认值,NULLS LAST 否则。 " SQLite 默认对空值进行排序,就好像它们更小一样。如果您从一个移动到另一个并且您在这里(像我一样)结束,那可能是您的问题。 postgresql.org/docs/8.3/static/queries-order.html#QUERIES-ORDER

标签: ruby-on-rails rails-postgresql


【解决方案1】:

我相信你想要:

@stories = Story.find(:all, :order => "created_at DESC" , :limit => 11)

Rails 3+ 更新:

@stories = Story.order(created_at: :desc).limit(11)

【讨论】:

    【解决方案2】:

    如果您使用的是 Rails 3,我还鼓励您使用很酷的新查询语法:

    @stories = Story.order('created_at DESC').limit(11)
    

    更多信息请参见Active Record Query Interface

    【讨论】:

    • 我尝试使用.limit(11),Rails 给了我一条关于无法识别语法的错误消息。
    猜你喜欢
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多