Rails 根据where条件传入的数组对记录进行排序

neo*_*ode 3 ruby arrays rubygems ruby-on-rails ruby-on-rails-4

我想按照我在 array 中传递值的顺序对我的 where 条件结果进行排序。我正在做的是我有一个 id 数组

ids = [80, 20, 3, 91, 84, 90, 98, 97, 68, 99, 92, 73]
Run Code Online (Sandbox Code Playgroud)

当我将此数组传递给 where 条件时,例如:

products = Product.where(id: ids)
Run Code Online (Sandbox Code Playgroud)

它以不同的顺序(随机顺序)返回结果活动记录关系,例如:

=>[ 20 ,84, 3,98 , .............. ] 
Run Code Online (Sandbox Code Playgroud)

(这是活动记录关系对象,我在这里只提到了 id)

但我希望它以相同的顺序返回对象,我正在传递类似的值(在活动记录关系对象中而不是数组中)

=> [80, 20, 3, 91, 84, 90, 98, 97, 68, 99, 92, 73]
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点 。

neo*_*ode 5

我有这个只需要做的解决方案

在 product.rb 文件中的产品模型中放置:

 def self.order_by_ids(ids)
    order_by = ["case"]
    ids.each_with_index.map do |id, index|
      order_by << "WHEN id='#{id}' THEN #{index}"
    end
    order_by << "end"
    order(order_by.join(" "))
  end
Run Code Online (Sandbox Code Playgroud)

查询将是:

products = Product.where(:id => ids).order_by_ids(ids)
Run Code Online (Sandbox Code Playgroud)

这里 ids 将是 id 的数组