ActiveRecord (Rails 4)确定查询中记录的索引



我想做的是确定一个销售人员在一个月内的排名,以尽可能少的步骤赚取佣金。我认为这可能是有可能与ActiveRecord +一些枚举方法的组合,但本质上我有一个模型,看起来像以下:

class Employee < ActiveRecord::Base
  validates :commission, presence: true
end

commission是一个整数。因此,为了获得所有员工的佣金从高到低的排序,我们可以做一些非常简单的事情:

Employee.order('commission desc')

我的问题是,假设我正在寻找的employee具有50的id。有什么简单的方法可以知道他们在赚取佣金方面的"排名"。如果他们在列表的顶部,他们就获得了#1的排名。如果它们在降序排序中是最后一个,则它们的最终排名是Employee.all.count

的大小。

共享相同佣金金额的员工应排名相同。多个员工共享一个等级是正确的

MySQL没有任何本地排名函数,因此您需要求助于GROUP_CONCAT方法来使其有效地工作:

Employee.
  select('employees.*, FIND_IN_SET(commission, ranks) AS rank').
  joins(', (SELECT GROUP_CONCAT(DISTINCT commission, ORDER BY commission DESC) AS ranks FROM employees) ranks').
  order('commission desc')

您也可以使用常用的自连接方法,但是随着表的增长,性能可能会显著降低。

你就不能数数有多少员工的佣金更高吗?

Employee.where('commission > ?', Employee.find(50).commission).count + 1
信贷:

如何计算一个记录's排名相比于其他基于单列在Rails?

这种文字方法的缺点是两个查询,但id查找应该是快速的,如果它还没有缓存或其他可用的,例如,如果你已经为该员工实例化了一个对象,你可以从中获得佣金,而不需要另一个查询。

最新更新