module Merit::ClassMethods

Public Instance Methods

_merit_delegate_methods_to_sash() click to toggle source

Delegate methods from meritable models to their sash

# File lib/merit/class_methods.rb, line 18
def _merit_delegate_methods_to_sash
  methods = %w(badge_ids badges points add_badge rm_badge
               add_points subtract_points score_points)
  methods.each { |method| delegate method, to: :_sash }
end
_merit_sash_initializer() click to toggle source

_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: blog.hasmanythrough.com/2012/1/20/modularized-association-methods-in-rails-3-2

# File lib/merit/class_methods.rb, line 33
def _merit_sash_initializer
  define_method(:_sash) do
    # TODO: reload.sash is not regression tested
    sash || reload.sash || update(sash: Sash.create)
    sash
  end
end
has_merit(options = {}) click to toggle source
# File lib/merit/class_methods.rb, line 5
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, class_name: 'Merit::Sash', inverse_of: nil, optional: true

  _merit_delegate_methods_to_sash
  _merit_define_badge_related_entries_method
  _merit_sash_initializer
end