Rails: 将空值排在最后的排序

104
在我的Rails app中,我遇到了一些问题,我想知道其他人是如何解决的:
有些记录的某个值是可选的,因此某些记录在该列中的值为空(null),而有些记录则不为空。
如果在某些数据库上按该列排序,则null在某些数据库上首先排序,而在某些数据库上最后排序。
例如,我有一些照片可能属于集合,即有些照片的collection_id=nil,有些照片的collection_id=1等。
如果我执行Photo.order('collection_id desc'),那么在SQLite上我会得到nulls在最后,但在PostgreSQL上我会得到nulls在最前面。
是否有一种好的、标准的Rails方法来处理这个问题并获得在任何数据库中都能保持性能一致的结果呢?
12个回答

-4

如果你想在不同的数据库类型中获得一致的结果,似乎必须使用Ruby来完成,因为数据库本身会解释NULLS是放在列表的前面还是后面。

Photo.all.sort {|a, b| a.collection_id.to_i <=> b.collection_id.to_i}

但这并不是非常高效的。


-4

2
嗯,我不是很喜欢这个想法,但我认为这会起作用。很抱歉让它开着这么久,我希望其他答案会出现。然而,经过更多的思考,我认为这可以成为照片模型上的一个方法,那样就不会感觉太糟糕了。 - Andrew
如果你使用mysql的话,这很容易。看看我的解决方案。 - Jacob
好的,我应该提到我的方法只是我能找到的最不偏见的方式。 - Eric
11
这个想法不好,因为where不返回一个数组,而是返回一个ActiveRecord::Relation对象,强制将结果转换为数组会导致所有期望标准ActiveRecord::Relation的东西失败(比如分页)。 - user2611793
1
虽然看起来可用的方法要么跳出了AR,要么不是(完全)可移植的,但这是真的。 - Eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接