【问题标题】:Getting a rank from ActiveRecord从 ActiveRecord 获得排名
【发布时间】:2011-08-18 07:22:23
【问题描述】:

如果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

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

提前致谢

【问题讨论】:

    标签: sql ruby activerecord


    【解决方案1】:

    你可以数一下积分少的用户数,再加一个。

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

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

    【讨论】:

    • 如此简单 - 我绝对应该想到这一点,谢谢!虽然我已经设法让自己的生活变得复杂,但我已经更新了问题,如果您对更改有答案,我将不胜感激!
    • 我想我自己找到了一个解决方案,但它似乎非常不红!看看上面,如果你认为有更好的方法来实现这一点,请告诉我。
    • 如此简单但如此有效我怎么想不到这个大声笑有人知道在哪里可以了解更多关于这种技巧/逻辑的信息吗?
    猜你喜欢
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多