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

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

例如,我有一个带有date和参加列的“显示”模型。

如果我运行下面的代码:

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

我得到以下结果:

 [#<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>] 

如果我运行下面的代码:

 @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>] 

但是,如果我运行:

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

要么

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

要么

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

我得到相同的结果,只按datesorting:

  [#<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>] 

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

 [#<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>] 

这是从日志生成的查询:

 [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 

最后,这是我的模型:

  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 

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

更新:感谢您的帮助,但似乎所有人都像我一样受难了。 什么解决了问题实际上是切换数据库。 我从默认的sqlite3切换到MySQL。

我注意到在你的第一个例子中,简单的:order =>“date” ,logging7在logging1之前sorting。 这个顺序也是你看多列sorting结果的方式,不pipe你是否参加sorting。

如果date不完全相同,这对我来说似乎是有意义的, 7的date在1的date之前。 而不是发现date是完全相等的,然后继续按照出席sorting,查询发现date不相等,并简单地sorting像所有其他logging。

我从浏览中看到,SQLite没有对DATE或DATETIME数据types的本地理解,而是让用户select他们必须自己parsing的浮点数或文本。 数据库中date的字面表示是否可能不完全相同? 大多数人似乎需要使用date函数,以便dateperformance得像您期望的那样。 也许有一种方法可以按date函数来包装你的订单,这个date函数会给你一些具体的比较,如date(date)ASC,参加DESC 。 我不确定这个语法是否有效,但是这是一个需要解决的问题。 希望有所帮助。

可能是两件事。 第一,

此代码已被弃用:

 Model.find(:all, :order => ...) 

应该:

 Model.order(...).all 

查找不再支持:all,:order和许多其他选项。

其次,你可能有一个default_scope在你调用Show之前执行一些sorting。

在互联网上search的小时数让我find了一些有用的文章来解释这个问题:

问题是date是一个保留的sqlite3关键字 。 我有一个类似的问题与时间 ,也是一个保留的关键字,在PostgreSQL工作正常,但不是在sqlite3。 解决scheme正在重命名该列

看到这个: Sqlite3 activerecord:order =>“时间DESC”不sorting

我刚刚遇到了同样的问题,但我设法让我的查询在SQLite中这样工作:

 @shows = Show.order("datetime(date) ASC, attending DESC") 

我希望这可以帮助别人节省一些时间

是不是只有:order => 'column1 ASC, column2 DESC'

确保直接在数据库级别检查架构。 之前我已经被烧毁了,例如,最初编写一个迁移以创build一个:datetime列,然后我在本地运行它,然后在实际部署之前将迁移调整为:date。 因此,除了我的数据库,每个人的数据库看起来都不错,而且这些错误是微妙的。

我明白为什么Rails的开发人员用sqlite3去开箱即用的实现,但是MySQL更加实用,恕我直言。 我意识到这取决于你正在构build你的Rails应用程序,但是大多数人都将默认的database.yml文件从sqlite3切换到MySQL。

很高兴你解决了你的问题。

你find你的解决scheme是很好的。 但这是一个有趣的问题。 我直接用sqlite3(不通过rails)试了一下,没有得到相同的结果,对我来说顺序出来了。

如果你想继续挖掘这个问题,我build议你要做的是启动sqlite3命令行应用程序,并检查架构和查询:

这显示了模式: .schema

然后运行select语句,就像它在日志文件中显示的那样: SELECT * FROM "shows" ORDER BY date ASC, attending DESC

这样你看,如果:

  1. 模式看起来像你想要的(该date实际上是一个date)
  2. date列实际上包含一个date,而不是一个时间戳(也就是说,你没有一天的时间,弄乱这种sorting)

这也可能有帮助:

 Post.order(created_at: :desc)