JP.*_*JP. 2 ruby sql activerecord
如果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
Run Code Online (Sandbox Code Playgroud)
我得到了明显的印象,这将是数据库密集型.我并不太担心,但显然需要较少处理能力的解决方案才是赢家!
如果给予具有相同数量的点的两个用户相同的等级太复杂,我准备接受上面的用户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
Run Code Online (Sandbox Code Playgroud)
有关如何使这更简洁的任何想法?
提前致谢
您可以计算点数较少的用户数量,然后添加一个.
def rank
User.where("points > ?", points).count + 1
end
Run Code Online (Sandbox Code Playgroud)
对于用户1和3,这将返回3.
| 归档时间: |
|
| 查看次数: |
1780 次 |
| 最近记录: |