假设我有一个非空ids
的Thing
对象 id 数组,我想使用things = Thing.find_all_by_id(ids)
. 我的印象是things
不一定会有类似于ids
.
我的印象正确吗?
如果是这样,我可以使用什么来代替
find_all_by_id
保留顺序并且不会不必要地多次访问数据库?
假设我有一个非空ids
的Thing
对象 id 数组,我想使用things = Thing.find_all_by_id(ids)
. 我的印象是things
不一定会有类似于ids
.
我的印象正确吗?
如果是这样,我可以使用什么来代替find_all_by_id
保留顺序并且不会不必要地多次访问数据库?
一探究竟:
Thing.where(:id => ids).sort! {|a, b| ids.index(a.id) <=> ids.index(b.id)}
where(:id => ids)
将使用IN()
. 然后排序!方法将遍历查询结果并比较 id 在 ids 数组中的位置。
@tybro0103 的答案会起作用,但对于大量的 ID 来说效率很低。特别是,Array#index 在 N 中是线性的。散列对于大 N 效果更好,如
by_id = Hash[Thing.where(:id => ids).map{|thing| [thing.id, thing]}]
ids.map{|i| by_id[i]}
您甚至可以使用此技术按任何不必要的唯一属性任意排序,如
by_att = Thing.where(:att => atts).group_by(&:att)
atts.flat_map{|a| by_att[a]}
在 rails 4 中不推荐使用 find_all_by_id ,这就是我在这里使用 where 的原因,但行为是相同的。