67 lines
1.5 KiB
Ruby
67 lines
1.5 KiB
Ruby
class Quantity < ActiveRecord::Base
|
|
include BodyTracking::Formula
|
|
|
|
enum domain: {
|
|
diet: 0,
|
|
measurement: 1,
|
|
exercise: 2
|
|
}
|
|
|
|
# Has to go before any 'dependent:' association
|
|
before_destroy do
|
|
# FIXME: disallow destruction if any object depends on this quantity
|
|
nil
|
|
end
|
|
|
|
acts_as_nested_set dependent: :destroy, scope: :project
|
|
belongs_to :project, required: false
|
|
has_and_belongs_to_many :column_views
|
|
|
|
validates :name, presence: true, uniqueness: {scope: :project_id}
|
|
validates :domain, inclusion: {in: domains.keys}
|
|
validate if: -> { parent.present? } do
|
|
errors.add(:parent, :parent_domain_mismatch) unless domain == parent.domain
|
|
end
|
|
validates :formula, formula: {allow_nil: true}
|
|
|
|
after_initialize do
|
|
if new_record?
|
|
self.domain ||= :diet
|
|
end
|
|
end
|
|
|
|
def movable?(direction)
|
|
case direction
|
|
when :up
|
|
self.left_sibling.present?
|
|
when :down
|
|
self.right_sibling.present?
|
|
when :left
|
|
self.parent.present?
|
|
when :right
|
|
left = self.left_sibling
|
|
left.present? && (left.domain == self.domain)
|
|
else
|
|
false
|
|
end
|
|
end
|
|
|
|
def formula_quantities
|
|
Formula.new(self.project, self.formula).get_quantities
|
|
end
|
|
|
|
def calculate(inputs)
|
|
Formula.new(self.project, self.formula).calculate(inputs)
|
|
end
|
|
|
|
def self.filter(project, filters)
|
|
quantities = all
|
|
|
|
if filters[:domain].present?
|
|
quantities = quantities.where(domain: domains[filters[:domain]])
|
|
end
|
|
|
|
quantities
|
|
end
|
|
end
|