Sha256: 007ddafb3f1e6ef4d1bea33301eeeec3f1d5bed79755ee2caf2673f99fcb2087

Contents?: true

Size: 1.8 KB

Versions: 3

Compression:

Stored size: 1.8 KB

Contents

module Merit
  extend ActiveSupport::Concern

  module ClassMethods
    def has_merit(options = {})
      # MeritableModel#sash_id is more stable than Sash#meritable_model_id
      # That's why MeritableModel belongs_to Sash. Can't use
      # :dependent => destroy as it may raise FK constraint exceptions. See:
      # https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/1079-belongs_to-dependent-destroy-should-destroy-self-before-assocation
      belongs_to :sash

      if Merit.orm == :mongo_mapper
        plugin Merit
        key :sash_id, String
        key :points, Integer, :default => 0
        key :level, Integer, :default => 0
      elsif Merit.orm == :mongoid
        field :sash_id
        field :points, :type => Integer, :default => 0
        field :level, :type => Integer, :default => 0
        def find_by_id(id)
          where(:_id => id).first
        end
      end

      # Delegate relationship methods from meritable models to their sash
      # _sash initializes a sash if doesn't have one yet.
      # From Rails 3.2 we can override association methods to do so
      # transparently, but merit supports Rails ~> 3.0.0. See:
      # http://blog.hasmanythrough.com/2012/1/20/modularized-association-methods-in-rails-3-2
      %w(badge_ids badges points add_badge rm_badge add_points substract_points).each do |method|
        delegate method, to: :_sash
      end
      define_method(:_sash) do
        if sash.nil?
          self.sash = Sash.create
          self.save(:validate => false)
        end
        self.sash
      end
    end
  end
end

if Object.const_defined?('ActiveRecord')
  ActiveRecord::Base.send :include, Merit
end
if Object.const_defined?('MongoMapper')
  MongoMapper::Document.plugin Merit
end
if Object.const_defined?('Mongoid')
  Mongoid::Document.send :include, Merit
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
merit-1.2.1 lib/merit/model_additions.rb
merit-1.2.0 lib/merit/model_additions.rb
merit-1.1.2 lib/merit/model_additions.rb