Sha256: fc8d02e73660e13dc5f698038350c80b23d05f856c4b1e3de054f33c08f1e1d0
Contents?: true
Size: 1.85 KB
Versions: 2
Compression:
Stored size: 1.85 KB
Contents
module Merit class Score < ActiveRecord::Base self.table_name = :merit_scores belongs_to :sash has_many :score_points, dependent: :destroy, class_name: 'Merit::Score::Point' # Meant to display a leaderboard. Accepts options :table_name (users by # default), :since_date (1.month.ago by default) and :limit (10 by # default). # # It lists top 10 scored objects in the last month, unless you change # query parameters. def self.top_scored(options = {}) options[:table_name] ||= :users options[:since_date] ||= 1.month.ago options[:limit] ||= 10 alias_id_column = "#{options[:table_name].to_s.singularize}_id" if options[:table_name] == :sashes sash_id_column = "#{options[:table_name]}.id" else sash_id_column = "#{options[:table_name]}.sash_id" end # MeritableModel – Sash –< Scores –< ScorePoints sql_query = <<SQL SELECT #{options[:table_name]}.id AS #{alias_id_column}, SUM(num_points) as sum_points FROM #{options[:table_name]} LEFT JOIN merit_scores ON merit_scores.sash_id = #{sash_id_column} LEFT JOIN merit_score_points ON merit_score_points.score_id = merit_scores.id WHERE merit_score_points.created_at > '#{options[:since_date]}' GROUP BY #{options[:table_name]}.id, merit_scores.sash_id ORDER BY sum_points DESC LIMIT #{options[:limit]} SQL results = ActiveRecord::Base.connection.execute(sql_query) results.map do |h| h.keep_if { |k, v| (k == alias_id_column) || (k == 'sum_points') } end results end def points score_points.group(:score_id).sum(:num_points).values.first || 0 end class Point < ActiveRecord::Base belongs_to :score, class_name: 'Merit::Score' has_many :activity_logs, class_name: Merit::ActivityLog, as: :related_change end end end
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
merit-1.7.1 | lib/merit/models/active_record/merit/score.rb |
merit-1.7.0 | lib/merit/models/active_record/merit/score.rb |