加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.0577zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 从ActiveRecord获取排名

发布时间:2021-02-28 13:48:56 所属栏目:MsSql教程 来源:网络整理
导读:如果用户有积分,我如何获得用户排名,假设标准定位: require 'active_record'class User ActiveRecord::Base def rank # ??? endendUser.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

如果用户有积分,我如何获得用户排名,假设标准定位:

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

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

提前致谢

解决方法

您可以计算点数较少的用户数量,然后添加一个.
def rank
  User.where("points > ?",points).count + 1
end

对于用户1和3,这将返回3.

(编辑:温州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读