Ruby on rails rails数组维护秩序

Ruby on rails rails数组维护秩序,ruby-on-rails,arrays,ruby,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 所选项目的顺序如何保持初始数组的顺序?假设您在单个请求中获取所有项目,即不分页,那么您可以在获取后使用初始数组的索引对项目进行排序,例如 @pick = Item.where('id IN (?)', array).sort_by do |item| array.index(item.id

使用硬编码数组

array = [30,29,31,13,10,12,6,7,8,9,11]
正在尝试执行查询

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

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

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

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

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

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

告诉数据库首选顺序并直接从数据库加载按该顺序排序的所有记录,而不是在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)

告诉数据库首选顺序并直接从数据库加载按该顺序排序的所有记录,而不是在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)

我欣赏它的简洁!但是,使用数组的索引,这是正确的思路。我欣赏它的简洁!但这是一个思路,使用数组的索引。或者这是一种理智的方法。不过,我可能会在Rails5的ApplicationRecord中包含FindByorderDedidSacTiveRecordExtension。我确实看到了这种方法的合理性。获取错误:{模块启动时,{处或附近出现语法错误。我不知道建议的代码可以关闭在哪里!很抱歉,我错过了{self.table_name}前面的一个错误在find_ordered方法的第一行中。我更新了我的答案。这是一种明智的方法。不过,我可能会在Rails5的ApplicationRecord中包含FindByorderDedidSactiveRecordExtension。我确实看到了这种方法的合理性。出现错误:语法错误在或接近{当模块启动时。我不知道建议的代码可以关闭在哪里!很抱歉,我在find_ordered方法的第一行中{self.table_name}前面遗漏了一个。我更新了我的答案。