rails数组维持秩序

时间:2018-01-06 16:29:47

标签: ruby-on-rails arrays ruby

使用硬编码数组

array = [30,29,31,13,10,12,6,7,8,9,11]

尝试执行查询

 @pick = Item.where('id IN (?)', array).to_a

所选项目的顺序如何保持初始数组的顺序?

2 个答案:

答案 0 :(得分:3)

假设您正在获取单个请求中的所有项目(即没有分页),那么您可以在使用初始数组中的索引获取后对项目进行排序,例如。

@pick = Item.where('id IN (?)', array).sort_by do |item|
  array.index(item.id)
end

答案 1 :(得分:2)

这是一种很好的方法来告诉数据库首选顺序并直接从数据库加载按该顺序排序的所有记录,而不是在Ruby中对记录进行排序。

将以下扩展名添加到您的应用程序中:

# e.g. in config/initializers/find_by_ordered_ids.rb
module FindByOrderedIdsActiveRecordExtension
  extend ActiveSupport::Concern

  module ClassMethods
    def find_ordered(ids)
      order_clause = "CASE #{self.table_name}.id "
      ids.each_with_index do |id, index|
        order_clause << "WHEN #{id} THEN #{index} "
      end
      order_clause << "ELSE #{ids.length} END"

      where(id: ids).order(order_clause)
    end
  end
end

ActiveRecord::Base.include(FindByOrderedIdsActiveRecordExtension)

你可以写这样的查询:

Item.find_ordered([2, 1, 3]) # => [2, 1, 3]