按id数组获取元素并按此数组排序

时间:2017-11-16 10:00:25

标签: ruby-on-rails activerecord ruby-on-rails-5

我想通过id数组获取产品,但我希望这些产品与id数组的顺序相同。

例如,我想要ID为6,3,8的产品:

ids = [6, 3, 8]
Product.where(id: ids)

它给了我产品,但第一个是id = 3的产品,第二个是id = 6 ......

我希望这些产品的顺序与ids数组相同。我希望第一个产品的id = 6,第二个产品的id = 3 ......

我怎么能在产品查询中这样做?

2 个答案:

答案 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