Sha256: 673e205ce70e4ec55da158d8d70510d523baea09a7bc125035e461c7ead71d90

Contents?: true

Size: 1.79 KB

Versions: 7

Compression:

Stored size: 1.79 KB

Contents

module Merit
  # Rankings are very similar to badges. They give "badges" which have a hierarchy
  # defined by +level+'s lexicografical order (greater is better). If a rank is
  # granted, lower level ranks are taken off. 5 stars is a common ranking use
  # case.
  #
  # They are not given at specified actions like badges, you should define a cron
  # job to test if ranks are to be granted.
  #
  # +set_rank+ accepts:
  # * +badge_name+ name of this ranking
  # * :+level+ ranking level (greater is better)
  # * :+to+ model or scope to check if new rankings apply
  module RankRules
    # Populates +defined_rules+ hash with following hierarchy:
    #   defined_rules[ModelToRank][rankings] = [level, conditions_block]
    def set_rank(ranking, *args, &block)
      options = args.extract_options!

      rule = Rule.new
      rule.badge_name = ranking
      rule.level      = options[:level]
      rule.block      = block

      defined_rules[options[:to]] ||= {}
      defined_rules[options[:to]][ranking] ||= []
      defined_rules[options[:to]][ranking] << rule
    end

    # Check rules defined for a merit_action
    def check_rank_rules
      defined_rules.each do |scoped_model, rankings| # For each model
        rankings.each do |ranking, rules| # For each model's ranking (stars, etc)
          rules.each do |rule|            # For each ranking's rule (level)
            scoped_model.all.each {|obj| grant_rank(rule, obj) }
          end
        end
      end
    end

    # Grant rank if rule applies
    # Badge checks if it's rank is greater than sash's current one.
    def grant_rank(rule, target_object)
      if rule.applies? target_object
        rule.badge.grant_rank_to target_object.sash
      end
    end

    # Currently defined rules
    def defined_rules
      @defined_rules ||= {}
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
merit-0.3.0 lib/merit/rules_rank.rb
merit-0.2.5 lib/merit/rules_rank.rb
merit-0.2.4 lib/merit/rules_rank.rb
merit-0.2.2 lib/merit/rules_rank.rb
merit-0.2.1 lib/merit/rules_rank.rb
merit-0.2.0 lib/merit/rules_rank.rb
merit-0.1.3 lib/merit/rules_rank.rb