【发布时间】:2015-04-22 10:17:58
【问题描述】:
如果我有 ids: 1,2,3,4 的记录并希望以某种方式对它们进行排序,例如 1、4、2、3,我该怎么做?
我想是这样的,但它当然行不通。
Service.all.order(id: [1, 4, 2, 3])
【问题讨论】:
标签: ruby-on-rails ruby sorting ruby-on-rails-4
如果我有 ids: 1,2,3,4 的记录并希望以某种方式对它们进行排序,例如 1、4、2、3,我该怎么做?
我想是这样的,但它当然行不通。
Service.all.order(id: [1, 4, 2, 3])
【问题讨论】:
标签: ruby-on-rails ruby sorting ruby-on-rails-4
贾斯汀·韦斯两天前写了一封blog article about this problem。
告诉数据库首选顺序并直接从数据库加载按该顺序排序的所有记录似乎是一种好方法。来自他的blog article 的示例。
将以下扩展添加到您的应用程序中:
# 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]
【讨论】:
find_by_ordered_ids.rb:1:in `<top (required)>': uninitialized constant Extensions (NameError)
order_clause = "CASE id " 替换为order_clause = "CASE #{self.table_name}.id "。这将防止在使用联接等时出现任何模棱两可的查询。
order = [1,4,2,3]
@services = []
order.each do |id|
@services << Services.find(id)
end
【讨论】: