rtopitt/bolao2014

View on GitHub
app/models/concerns/event_bet.rb

Summary

Maintainability
A
0 mins
Test Coverage
module EventBet
  extend ActiveSupport::Concern

  included do
    belongs_to :bet

    validates :bet,
      presence: true

    validates :points,
      presence: true,
      numericality: { only_integer: true, greater_than_or_equal_to: 0, allow_blank: true }

    scope :scored, -> { where.not(points: nil, scored_at: nil) }
  end

  module ClassMethods
  end

  def next_event_to_bet
    self.bet.
      send("bettable_#{self.event.class.to_s.downcase.underscore.pluralize}_still_to_bet").
      where.not(number: self.event.number).
      order(number: :asc).limit(1).first
  end

  # Returns true if this event_bet is ready to be scored.
  def scorable?
    self.valid? && self.event.scorable?
  end

  # Returns true if this event_bet has been scored.
  def scored?
    self.scored_at? && self.points >= 0
  end

  # Calculates and saves points for this event_bet.
  def score!
    previous_points = self.points
    calculate_score
    self.save!
    current_points = self.points
    # notify user of the score
    notify_user_of_points_change(previous_points, current_points)
    # update / recalculate bet total points
    recalculate_bet
    true
  end

  def recalculate_bet
    BetScoreWorker.perform_async(self.bet.id)
    BetScoreWorker.perform_in(5.minutes, self.bet.id)
  end
  private :recalculate_bet

end