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

Cod*_*nts 76 ruby activerecord ruby-on-rails

我似乎无法使用ActiveRecord :: Base.find选项:一次订购多个列.

例如,我有一个带有日期和参加列的"显示"模型.

如果我运行以下代码:

@shows = Show.find(:all, :order => "date")
Run Code Online (Sandbox Code Playgroud)

我得到以下结果:

[#<Show id: 7, date: "2009-04-18", attending: 2>, 
 #<Show id: 1, date: "2009-04-18", attending: 78>, 
 #<Show id: 2, date: "2009-04-19", attending: 91>, 
 #<Show id: 3, date: "2009-04-20", attending: 16>,
 #<Show id: 4, date: "2009-04-21", attending: 136>]
Run Code Online (Sandbox Code Playgroud)

如果我运行以下代码:

@shows = Show.find(:all, :order => "attending DESC")

[#<Show id: 4, date: "2009-04-21", attending: 136>,
 #<Show id: 2, date: "2009-04-19", attending: 91>,
 #<Show id: 1, date: "2009-04-18", attending: 78>,
 #<Show id: 3, date: "2009-04-20", attending: 16>,
 #<Show id: 7, date: "2009-04-18", attending: 2>]
Run Code Online (Sandbox Code Playgroud)

但是,如果我跑:

@shows = Show.find(:all, :order => "date, attending DESC")
Run Code Online (Sandbox Code Playgroud)

要么

@shows = Show.find(:all, :order => "date, attending ASC")
Run Code Online (Sandbox Code Playgroud)

要么

@shows = Show.find(:all, :order => "date ASC, attending DESC")
Run Code Online (Sandbox Code Playgroud)

我得到的结果与仅按日期排序相同:

 [#<Show id: 7, date: "2009-04-18", attending: 2>, 
 #<Show id: 1, date: "2009-04-18", attending: 78>, 
 #<Show id: 2, date: "2009-04-19", attending: 91>, 
 #<Show id: 3, date: "2009-04-20", attending: 16>,
 #<Show id: 4, date: "2009-04-21", attending: 136>]
Run Code Online (Sandbox Code Playgroud)

在哪里,我想得到这些结果:

[#<Show id: 1, date: "2009-04-18", attending: 78>,
#<Show id: 7, date: "2009-04-18", attending: 2>, 
 #<Show id: 2, date: "2009-04-19", attending: 91>, 
 #<Show id: 3, date: "2009-04-20", attending: 16>,
 #<Show id: 4, date: "2009-04-21", attending: 136>]
Run Code Online (Sandbox Code Playgroud)

这是从日志生成的查询:

[4;35;1mUser Load (0.6ms)[0m   [0mSELECT * FROM "users" WHERE ("users"."id" = 1) LIMIT 1[0m
[4;36;1mShow Load (3.0ms)[0m   [0;1mSELECT * FROM "shows" ORDER BY date ASC, attending DESC[0m
[4;35;1mUser Load (0.6ms)[0m   [0mSELECT * FROM "users" WHERE ("users"."id" = 1) [0m
Run Code Online (Sandbox Code Playgroud)

最后,这是我的模型:

  create_table "shows", :force => true do |t|
    t.string   "headliner"
    t.string   "openers"
    t.string   "venue"
    t.date     "date"
    t.text     "description"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.decimal  "price"
    t.time     "showtime"
    t.integer  "attending",   :default => 0
    t.string   "time"
  end
Run Code Online (Sandbox Code Playgroud)

我错过了什么?我究竟做错了什么?

更新:感谢您的所有帮助,但似乎所有人都和我一样难过.解决问题的是实际切换数据库.我从默认的sqlite3切换到mysql.

the*_*ole 46

可能是两件事.第一,

不推荐使用此代码:

Model.find(:all, :order => ...)
Run Code Online (Sandbox Code Playgroud)

应该:

Model.order(...).all
Run Code Online (Sandbox Code Playgroud)

使用:all,:order和许多其他选项不再支持Find.

其次,你可能有这是执行一些命令你叫前default_scope findShow.

在互联网上挖掘的时间让我得到了一些有用的文章来解释这个问题:


bri*_*ism 36

我注意到在你的第一个例子中,简单:order =>"date",记录7在记录1之前排序.此顺序也是您在多列排序中查看结果的方式,无论您是否按参加排序.

如果日期不完全相同,那么这似乎对我有意义,7的日期在1的日期之前.而不是发现日期 s完全相等,然后通过参加进行排序,查询发现日期不相等,只是像所有其他记录一样排序.

我从浏览中看到SQLite没有对DATE或DATETIME数据类型的本地理解,而是让用户可以选择他们必须自己解析的浮点数或文本.数据库中日期的文字表示可能不完全相等吗?大多数人似乎需要使用日期函数,以便日期的行为与您期望的一样.也许有一种方法可以按列包装您的订单,其中包含日期功能,可以为您提供具体的比较功能,例如日期(日期)ASC,参加DESC.我不确定语法是否有效,但这是解决问题的一个方面.希望有所帮助.

  • 我将数据库从sqlite3切换到mysql.这使问题消失了. (4认同)

oma*_*oma 14

问题是date是一个保留的sqlite3关键字.我有一个类似的时间问题,也是一个保留关键字,在PostgreSQL中运行良好,但在sqlite3中没有.解决方案是重命名列.

请参阅:Sqlite3 activerecord:order =>"time DESC"不排序