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