Sha256: a6bd1ffe55ca482285f1b25b758f1f3a581453fb5026112061267a260e2517a0

Contents?: true

Size: 1.91 KB

Versions: 1

Compression:

Stored size: 1.91 KB

Contents

# frozen_string_literal: true

# == Schema Information
#
# Table name: site_activities
#
#  id           :integer          not null, primary key
#  title        :string(255)
#  value        :float            default(0.0)
#  min_value    :float
#  max_value    :float
#  is_increment :boolean
#  sort_order   :integer          default(1)
#  last_value   :integer
#  last_date    :date
#  created_at   :datetime
#  updated_at   :datetime
#  parent_id    :integer
#  is_procent   :boolean
#

class SiteActivity < ActiveRecord::Base
  validates :title, :value, :min_value, :max_value, presence: true
  validates :value, :min_value, :max_value, numericality: true
  validate :min_max

  belongs_to :parent, class_name: 'SiteActivity', foreign_key: 'parent_id'

  scope :sorted, -> { order("#{quoted_table_name}.sort_order") }

  def displayed_value
    return (value * parent.displayed_value).to_i unless parent_id.nil?
    return value if current_day?

    Rails.cache.fetch(cached_key('displayed_value'), expires_in: 2.hours) do
      result = if is_increment
                 increment_value
               else
                 n = value % 1 > 0 ? 10.0 : 1
                 ((min_value * n).to_i..(max_value * n).to_i).to_a.sample / n
      end

      result
    end
  end

  def view
    _value = format('%g', displayed_value)
    is_procent ? "#{_value}%" : _value
  end

  def increment_value
    last = last_value || value

    if last_date.nil? || !current_day?(last_date)
      self.last_date = Date.current

      self.last_value = last + (min_value.to_i..max_value.to_i).to_a.sample

      save(validate: false)
      return last_value
    else
      last
    end
  end

  def current_day?(date = nil)
    date ||= created_at

    date.to_date == Date.current
  end

  private

  def min_max
    errors.add(:max_value, :invalid) if min_value > max_value
  end

  def cached_key(value)
    ['site_activity', id.to_s, value.to_s].join(':')
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
translation_cms-0.1.5 app/models/site_activity.rb