ruby-on-rails - Active Records 按 ID 排序

标签 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])

最佳答案

Justin Weiss 写了 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]

关于ruby-on-rails - Active Records 按 ID 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29785546/

相关文章:

ruby - 为什么 uniq!如果没有重复则返回 nil

mysql - 如何使用 ruby​​ 版本 1.8.4 gem 安装 mysql?

c++ - 尝试按任何类成员对对象 vector 进行排序

c - 什么算法可以在线性时间内对新值和重复值进行排序,而不使用额外的空间?

ruby-on-rails - Rails 系统堆栈错误 : stack level too deep

ruby-on-rails - 生产模式的 Ckeditor gem 问题

ruby-on-rails - Rails 3 + 迁移中的设计错误 : undefined method timeoutable

Ruby yield 示例解释?

listview - 如何在 .NET ListView 中设置标题排序字形?

ruby-on-rails - 如何删除单个 HABTM 关联项目而不删除该项目本身?