我想通过id数组获取产品,但我希望这些产品与id数组的顺序相同。
例如,我想要ID为6,3,8的产品:
ids = [6, 3, 8]
Product.where(id: ids)
它给了我产品,但第一个是id = 3的产品,第二个是id = 6 ......
我希望这些产品的顺序与ids
数组相同。我希望第一个产品的id = 6,第二个产品的id = 3 ......
我怎么能在产品查询中这样做?
答案 0 :(得分:2)
索引应该有效:
Product.where(id: ids).index_by(&:id).values_at(*ids)
或者只是(在MySQL中检查过,但如果ID来自外部来源,请先清理ids
):
Product.where(id: ids).order("field(id, #{ids.join(', ')})")
答案 1 :(得分:1)
如果要在一个ActiveRecord查询中执行此操作,它取决于您使用的RDBMS,并在order
方法中包含原始sql字符串,但您也可以在普通红宝石中执行此操作:
Product.where(id: ids).sort_by { |item| ids.index(item.id) }
P.S。排序后的集合类将从ActiveRecord_Relation
更改为Array
。