69 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
# == Schema Information
 | 
						|
#
 | 
						|
# Table name: completions
 | 
						|
#
 | 
						|
#  id                      :integer          not null, primary key
 | 
						|
#  display_relative_time   :string
 | 
						|
#  display_time_from_start :string
 | 
						|
#  remaining_pieces        :integer
 | 
						|
#  time_seconds            :integer
 | 
						|
#  created_at              :datetime         not null
 | 
						|
#  updated_at              :datetime         not null
 | 
						|
#  contest_id              :integer          not null
 | 
						|
#  contestant_id           :integer          not null
 | 
						|
#  message_id              :integer
 | 
						|
#  puzzle_id               :integer          not null
 | 
						|
#
 | 
						|
# Indexes
 | 
						|
#
 | 
						|
#  index_completions_on_contest_id     (contest_id)
 | 
						|
#  index_completions_on_contestant_id  (contestant_id)
 | 
						|
#  index_completions_on_message_id     (message_id)
 | 
						|
#  index_completions_on_puzzle_id      (puzzle_id)
 | 
						|
#
 | 
						|
# Foreign Keys
 | 
						|
#
 | 
						|
#  contest_id     (contest_id => contests.id)
 | 
						|
#  contestant_id  (contestant_id => contestants.id)
 | 
						|
#  message_id     (message_id => messages.id)
 | 
						|
#  puzzle_id      (puzzle_id => puzzles.id)
 | 
						|
#
 | 
						|
class Completion < ApplicationRecord
 | 
						|
  belongs_to :contest
 | 
						|
  belongs_to :contestant
 | 
						|
  belongs_to :puzzle
 | 
						|
  belongs_to :message, optional: true
 | 
						|
 | 
						|
  before_save :add_time_seconds
 | 
						|
  before_save :nullify_display_time
 | 
						|
 | 
						|
  validates :display_time_from_start, presence: true, format: { with: /\A(((\d\d|\d):\d\d|\d\d|\d):\d\d|\d\d|\d)\z/ }, if: -> { remaining_pieces == nil }
 | 
						|
  validates :contestant_id, uniqueness: { scope: :puzzle }, if: -> { contest.puzzles.size == 1 }
 | 
						|
  validates :puzzle_id, uniqueness: { scope: :contestant }, if: -> { contest.puzzles.size > 1 }
 | 
						|
  validate :remaining_pieces_is_correct
 | 
						|
 | 
						|
  def remaining_pieces_is_correct
 | 
						|
    if self.remaining_pieces && self.remaining_pieces > self.puzzle.pieces
 | 
						|
      errors.add(:remaining_pieces, "Cannot be greater than the number of pieces for this puzzle")
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def nullify_display_time
 | 
						|
    if self.remaining_pieces
 | 
						|
      self.display_time_from_start = nil
 | 
						|
      self.display_relative_time = nil
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def add_time_seconds
 | 
						|
    arr = display_time_from_start.split(":")
 | 
						|
    if arr.size == 3
 | 
						|
      self.time_seconds = arr[0].to_i * 3600 + arr[1].to_i * 60 + arr[2].to_i
 | 
						|
    elsif arr.size == 2
 | 
						|
      self.time_seconds = arr[0].to_i * 60 + arr[1].to_i
 | 
						|
    elsif arr.size == 1
 | 
						|
      self.time_seconds = arr[0].to_i
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |