Rails 3使用NOT NULL在.where条件之后排序

我有一个显示最快用户的排名:

@users = User.find.sort { |a, b| b.finished_at  a.created_at } 

现在我要添加一些代码以防止因为finished_at beeing nil而导致错误,直到用户完成。

 @users = User.find(:all, :conditions => "finished_at IS NOT NULL").sort { |a, b| b.finished_at  a.created_at } 

sort不起作用。 这种链接方法有缺陷吗? 并且find(:all, :conditions => "finished_at IS NOT NULL") rails 3路还是过时的?

提前致谢

rails 3的方式来查询这个将是:

 @users = User.where('finished_at IS NOT NULL') 

至于排序,是的,可以这样链。 一个简单的排序,它只在一个字段上,在sql中会更好:

 @users = User.where('finished_at IS NOT NULL').order(:finished_at) 

但是,你的排序做了一些奇怪的事情,比较左边的一个字段和右边的另一个字段。 我不认为你的排序算法能够正常工作,因为它取决于初始记录顺序。 由于您将苹果与橙子进行比较,因此不会保持一致。

你说“最快的用户”,这让我觉得你真的想要created_at和finished_at次之间的时差:

 @users = User.where('finished_at IS NOT NULL'). sort {|a,b| (a.finished_at - a.created_at) <=> (b.finished_at - b.created_at) 

如果你想让rails 3延迟加载那么,你必须在sql中排序,而不是在ruby中。 这应该在mysql中工作我认为:

 @users = User.where('finished_at IS NOT NULL'). select('users.*, timediff(finished_at,created_at) AS duration'). order('duration') 

这样,在实际调用值之前不会执行查询,这在您需要页面缓存时会有所帮助。 您还可以享受以下时间:

 @users[0].duration