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 find
上Show
.
在互联网上挖掘的时间让我得到了一些有用的文章来解释这个问题:
bri*_*ism 36
我注意到在你的第一个例子中,简单:order =>"date",记录7在记录1之前排序.此顺序也是您在多列排序中查看结果的方式,无论您是否按参加排序.
如果日期不完全相同,那么这似乎对我有意义,7的日期在1的日期之前.而不是发现日期 s完全相等,然后通过参加进行排序,查询发现日期不相等,只是像所有其他记录一样排序.
我从浏览中看到SQLite没有对DATE或DATETIME数据类型的本地理解,而是让用户可以选择他们必须自己解析的浮点数或文本.数据库中日期的文字表示可能不完全相等吗?大多数人似乎需要使用日期函数,以便日期的行为与您期望的一样.也许有一种方法可以按列包装您的订单,其中包含日期功能,可以为您提供具体的比较功能,例如日期(日期)ASC,参加DESC.我不确定语法是否有效,但这是解决问题的一个方面.希望有所帮助.
oma*_*oma 14
问题是date是一个保留的sqlite3关键字.我有一个类似的时间问题,也是一个保留关键字,在PostgreSQL中运行良好,但在sqlite3中没有.解决方案是重命名列.
请参阅:Sqlite3 activerecord:order =>"time DESC"不排序