18F/confidential-survey

View on GitHub
app/models/tally.rb

Summary

Maintainability
A
0 mins
Test Coverage
class Tally < ActiveRecord::Base
  validates :field, presence: true
  validates :value, presence: true
  validates :survey_id, presence: true
  validates :count, numericality: {only_integer: true,
                                   greater_than_or_equal_to: 0}

  def self.record(survey_id, field, value)
    t = where(survey_id: survey_id, field: field, value: value).first_or_create
    t.increment!(:count)
    t
  end

  def self.tallies_for(survey_id, field)
    where(survey_id: survey_id, field: field)
  end

  def self.tally_for(survey_id, field, value)
    t = where(survey_id: survey_id, field: field, value: value).first
    t.nil? ? 0 : t.count
  end

  def self.total_for(survey_id, field)
    tallies_for(survey_id, field).sum(:count)
  end

  def to_s
    "Tally #{survey_id}:#{field} \"#{value}\": #{count}"
  end
end