gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:41:48 26 4
gpt4 key购买 nike

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

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

现在我想添加一些代码来防止由于 finished_at 蜂鸣 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

关于ruby - Rails 3 使用 NOT NULL 在 .where 条件之后排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6440039/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com