小编典典

从ActiveRecord获得排名

sql

如果Users有分数,假设标准位置,我如何获得用户排名:

require 'active_record'

class User < ActiveRecord::Base
  def rank
    # ???
  end
end

User.all
# => [<User id:1 points:100>, <User id:2 points:400>, <User id:3 points:100>, <User id:4 points:250>]

User.find_by_id(2).rank
# => 1
User.find_by_id(3).rank
# => 3
User.find_by_id(1).rank
# => 3

我得到的独特印象是这将是数据库密集型的。我对此不太担心,但是显然,需要较少处理能力的解决方案才是赢家!

如果给两个具有相同点数的用户相同的排名太复杂了,我准备接受上面的用户1可能是排名3,而用户3可能是排名4。

编辑:

实际上,我是在单独的一堂课中存储gmy分数-因为每个事件都需要一定数量的分数。

class Event < ActiveRecord::Base
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :events

  def points
    events.sum(:amount)
  end

  def rank
    # This seems a bit ham-handed
    Event.count_by_sql(['select count(*) from (select sum(amount) as points from events group by user_id) where points > ?',points]) + 1
  end
end

关于如何使其更简洁的任何想法?

提前致谢


阅读 156

收藏
2021-05-05

共1个答案

小编典典

您可以计算点数较少的用户数,然后加一。

def rank
  User.where("points > ?", points).count + 1
end

这将为用户1和3返回3。

2021-05-05