class ElegantLeaderboard::RankEvaluator

Attributes

model_object[R]

Public Class Methods

new(attributes = {}) click to toggle source
# File lib/elegant_leaderboard/rank_evaluator.rb, line 10
def initialize(attributes = {})
  @model_object = attributes[:model_object]
  @config       = attributes[:config]
end

Public Instance Methods

current_rank() click to toggle source
# File lib/elegant_leaderboard/rank_evaluator.rb, line 15
def current_rank
  return high_rankers unless equal_rankers?
  high_rankers + position_amongst_equal_rankers
end
rank_around() click to toggle source
# File lib/elegant_leaderboard/rank_evaluator.rb, line 20
def rank_around
  offset = current_rank - (around_limit + 1)
  limit_setting = around_limit * 2 + 1

  if offset < 0
    limit_setting += offset
    offset = 0
  end

  top_rankers(limit_setting).offset(offset)
end
top_rankers(user_limit) click to toggle source
# File lib/elegant_leaderboard/rank_evaluator.rb, line 32
def top_rankers(user_limit)
  model_klass.order("#{column_name} DESC, #{sort_order}")
             .limit(user_limit)
end

Private Instance Methods

column_value() click to toggle source
# File lib/elegant_leaderboard/rank_evaluator.rb, line 41
def column_value
  @column_value ||= model_object.public_send(column_name)
end
equal_rankers() click to toggle source
# File lib/elegant_leaderboard/rank_evaluator.rb, line 56
def equal_rankers
  @equal_rankers ||= model_klass.where("#{column_name} = ?", column_value)
                                .order(sort_order)
                                .select(:id)
end
equal_rankers?() click to toggle source
# File lib/elegant_leaderboard/rank_evaluator.rb, line 52
def equal_rankers?
  equal_rankers && equal_rankers.count > 1
end
high_rankers() click to toggle source
# File lib/elegant_leaderboard/rank_evaluator.rb, line 45
def high_rankers
  rankers_count = model_klass.where("#{column_name} > ?", column_value)
                             .order("#{column_name} DESC").count

  @high_rankers ||= rankers_count + 1
end
position_amongst_equal_rankers() click to toggle source
# File lib/elegant_leaderboard/rank_evaluator.rb, line 62
def position_amongst_equal_rankers
  equal_rankers.index(model_object).to_i
end