Ruby on rails 按ID排序的活动记录

Ruby on rails 按ID排序的活动记录,ruby-on-rails,ruby,sorting,ruby-on-rails-4,Ruby On Rails,Ruby,Sorting,Ruby On Rails 4,如果我有ID为1,2,3,4的记录,并且希望以某种方式对它们进行排序,比如1,4,2,3,我该怎么做 我是这么想的,但当然不行 Service.all.order(id: [1, 4, 2, 3]) order=[1,4,2,3] @服务=[] 订单号。每个do | id| @服务贾斯汀·韦斯两天前写了一篇文章 将首选顺序告知数据库并直接从数据库加载按该顺序排序的所有记录似乎是一种很好的方法。他的例子 将以下扩展添加到应用程序中: # e.g. in config/initializers/f

如果我有ID为1,2,3,4的记录,并且希望以某种方式对它们进行排序,比如1,4,2,3,我该怎么做

我是这么想的,但当然不行

Service.all.order(id: [1, 4, 2, 3])
order=[1,4,2,3]
@服务=[]
订单号。每个do | id|
@服务贾斯汀·韦斯两天前写了一篇文章

将首选顺序告知数据库并直接从数据库加载按该顺序排序的所有记录似乎是一种很好的方法。他的例子

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

# e.g. in config/initializers/find_by_ordered_ids.rb
module FindByOrderedIdsActiveRecordExtension
  extend ActiveSupport::Concern
  module ClassMethods
    def find_ordered(ids)
      order_clause = "CASE 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)

这是非常低效的,因为它会使N(数组大小)查询到数据库,而不是仅仅一个。完全同意。OP没有提到他们是否关心会发生多少查询,或者他们是否会比示例中使用的4个查询做得更多。嗯,现在
find\u by\u ordered\u id.rb:1:in`':uninitialized constant Extensions(NameError)
@VitalyFry:我从原始示例中删除了名称空间。请再试一次。我建议您将
order\u子句=“CASE id”
替换为
order\u子句=“CASE”{self.table\u name}.id”
。这将防止在使用联接和诸如此类的操作时出现任何不明确的查询。
# e.g. in config/initializers/find_by_ordered_ids.rb
module FindByOrderedIdsActiveRecordExtension
  extend ActiveSupport::Concern
  module ClassMethods
    def find_ordered(ids)
      order_clause = "CASE 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)
Service.find_ordered([2, 1, 3]) # => [2, 1, 3]