Ruby on rails Rails 3中按多列对行进行高效排序

Ruby on rails Rails 3中按多列对行进行高效排序,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我有一个具有以下列的表名事务 created_at | debit | credit | balance | account_id 2012-2-2 02:22:22 | 3000 | 0 | 0 | 8 2012-2-2 07:22:22 | 500 | 1000 | 0 | 8 2012-2-2 09:22:22 | 0 | 8000 | 0 | 8 2012-3-3 19:17:20 | 1000 | 0

我有一个具有以下列的表名事务

created_at        | debit | credit | balance | account_id
2012-2-2 02:22:22 | 3000  | 0      | 0       | 8
2012-2-2 07:22:22 | 500   | 1000   | 0       | 8
2012-2-2 09:22:22 | 0     | 8000   | 0       | 8

2012-3-3 19:17:20 | 1000  | 0      | 0       | 8
2012-3-3 04:02:22 | 0     | 8000   | 0       | 8
在计算余额之前,我需要

  • 按日期(即每天)对交易进行排序
  • 然后按借方排序(较高的借方必须先到)
我有一百万笔交易以账户id区分。在这种情况下,什么是有效的排序方式

任何答案都将不胜感激。

这听起来很像

这种查询正是关系数据库擅长的,如果有适当的索引,它对您来说应该是高效的

对于某个特定帐户

Transaction.find_by_account_id(some_id, :order => "created_at DESC, debit DESC")
如果将此设置为帐户上正确的ActiveRecord关联,则可以在其中设置顺序,以便始终以首选顺序返回关联:

class Account
    has_many :transactions, :order => "created_at DESC, debit DESC"
end

这样,任何时候你向一个账户询问它的交易,比如
account.find(12345)。交易
,它们都会自动按首选排序返回。

我可能有点误解,但在每个日期按时间排序不就是按时间排序吗?如果先按时间排序,那么任何第二次排序都不重要,除非两个事务完全同时发生。也许你的意思是按日期排序,然后按借方排序?试着按日期分组,然后按借方排序。@Operator:是的,我的意思是按日期:)我知道这个答案是在2012年发布的,但为了帮助可能需要的人,我将在Rails 4.0+中发布一种方法,由于
:在
中的订单
已经有许多块被弃用,需要用lambda作用域块替换。您可以使用
hash
样式:
有多个:事务、>{order(创建于::desc,debit:desc)}
,或者仍然是
字符串:
有多个:事务、>{order('created于::desc,debit:desc')
class Account
    has_many :transactions, :order => "created_at DESC, debit DESC"
end