Sha256: 098cb0cbcff55a93387cd9e45d13fcc42ab14db51342b7a5cfd5326843f53730

Contents?: true

Size: 1.99 KB

Versions: 10

Compression:

Stored size: 1.99 KB

Contents

module Merit
  require 'ambry'
  require 'ambry/active_model'

  class Badge
    extend Ambry::Model
    extend Ambry::ActiveModel

    field :id, :name, :level, :description, :custom_fields

    validates_presence_of :id, :name
    validates_uniqueness_of :id

    filters do
      def find_by_id(ids)
        ids = Array.wrap(ids)
        find { |b| ids.include? b[:id] }
      end

      def by_name(name)
        find { |b| b.name == name.to_s }
      end

      def by_level(level)
        find { |b| b.level.to_s == level.to_s }
      end
    end

    def _mongoid_sash_in(sashes)
      {:sash_id.in => sashes}
    end

    def _active_record_sash_in(sashes)
      {sash_id: sashes}
    end

    class << self
      def find_by_name_and_level(name, level)
        badges = Merit::Badge.by_name(name)
        badges = badges.by_level(level) unless level.nil?
        if (badge = badges.first).nil?
          str = "No badge '#{name}' found. Define it in initializers/merit.rb"
          fail ::Merit::BadgeNotFound, str
        end
        badge
      end

      # DEPRECATED: `last_granted` will be removed from merit, please refer to:
      # https://github.com/tute/merit/wiki/How-to-show-last-granted-badges
      def last_granted(options = {})
        warn '[merit] [DEPRECATION] `last_granted` will be removed from merit, please refer to: https://github.com/tute/merit/wiki/How-to-show-last-granted-badges'
        options[:since_date] ||= 1.month.ago
        options[:limit]      ||= 10
        BadgesSash.last_granted(options)
      end

      # Defines Badge#meritable_models method, to get related
      # entries with certain badge. For instance, Badge.find(3).users
      # orm-specified
      def _define_related_entries_method(meritable_class_name)
        define_method(:"#{meritable_class_name.underscore.pluralize}") do
          sashes = BadgesSash.where(badge_id: id).pluck(:sash_id)
          meritable_class_name.constantize.where(send "_#{Merit.orm}_sash_in", sashes)
        end
      end
    end
  end
end

Version data entries

10 entries across 10 versions & 1 rubygems

Version Path
merit-3.0.2 app/models/merit/badge.rb
merit-3.0.1 app/models/merit/badge.rb
merit-3.0.0 app/models/merit/badge.rb
merit-2.4.0 app/models/merit/badge.rb
merit-2.3.4 app/models/merit/badge.rb
merit-2.3.3 app/models/merit/badge.rb
merit-2.3.2 app/models/merit/badge.rb
merit-2.3.1 app/models/merit/badge.rb
merit-2.3.0 app/models/merit/badge.rb
merit-2.2.0 app/models/merit/badge.rb