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
 |