Получение ранга от ActiveRecord - PullRequest
       2

Получение ранга от ActiveRecord

2 голосов
/ 18 августа 2011

Если у User s есть баллы, как я могу получить ранг пользователя, при условии стандартного позиционирования:

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.

РЕДАКТИРОВАТЬ:

Я на самом деле Storin 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

Есть идеи, как сделать это более кратким?

Заранее спасибо

1 Ответ

9 голосов
/ 18 августа 2011

Вы можете подсчитать количество пользователей, у которых меньше очков, и добавить один.

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

Это вернет 3 для пользователей 1 и 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...