Added Goal model and preliminary Targets index
This commit is contained in:
6
app/models/goal.rb
Normal file
6
app/models/goal.rb
Normal file
@@ -0,0 +1,6 @@
|
||||
class Goal < ActiveRecord::Base
|
||||
belongs_to :project, required: true
|
||||
has_many :targets, inverse_of: :goal, dependent: :destroy
|
||||
|
||||
validates :name, presence: true, uniqueness: {scope: :project_id}
|
||||
end
|
||||
@@ -2,7 +2,7 @@ class Ingredient < ActiveRecord::Base
|
||||
belongs_to :composition, inverse_of: :ingredients, polymorphic: true, required: true
|
||||
belongs_to :food, required: true
|
||||
belongs_to :part_of, required: false
|
||||
has_many :nutrients, through: :food, source: :nutrients
|
||||
has_many :nutrients, through: :food
|
||||
|
||||
DOMAIN = :diet
|
||||
alias_attribute :subitems, :nutrients
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
class Nutrient < QuantityValue
|
||||
belongs_to :food, foreign_key: 'registry_id', foreign_type: 'registry_type',
|
||||
inverse_of: :nutrients, polymorphic: true, required: true
|
||||
# Need to specify polymorphic association so :registry_type gets written (see
|
||||
# QuantityValue for explanation why it's needed)
|
||||
belongs_to :food, inverse_of: :nutrients, polymorphic: true, required: true,
|
||||
foreign_key: 'registry_id', foreign_type: 'registry_type'
|
||||
|
||||
# Uniqueness NOT validated here, see Value for explanation
|
||||
#validates :quantity, uniqueness: {scope: :food_id}
|
||||
|
||||
@@ -9,6 +9,7 @@ class Quantity < ActiveRecord::Base
|
||||
belongs_to :project, inverse_of: :quantities, required: false
|
||||
has_many :nutrients, dependent: :restrict_with_error
|
||||
has_many :readouts, dependent: :restrict_with_error
|
||||
has_many :thresholds, dependent: :restrict_with_error
|
||||
has_many :values, class_name: 'QuantityValue', dependent: :restrict_with_error
|
||||
has_many :exposures, dependent: :destroy
|
||||
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
class QuantityValue < ActiveRecord::Base
|
||||
# Requirement validation for :registry left to subclasses
|
||||
# Polymorphic registry (including :registry_type) is required - despite 1:1
|
||||
# mapping between Nutrient:Food, Readout:Measurement, Threshold:Target ... -
|
||||
# to allow for accessing registry item without knowing QuantityValue (subitem)
|
||||
# type, e.g. qv.registry.completed_at
|
||||
belongs_to :registry, polymorphic: true
|
||||
belongs_to :quantity, required: true
|
||||
belongs_to :unit, required: true
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
class Readout < QuantityValue
|
||||
belongs_to :measurement, foreign_key: 'registry_id', foreign_type: 'registry_type',
|
||||
inverse_of: :readouts, polymorphic: true, required: true
|
||||
# Need to specify polymorphic association so :registry_type gets written (see
|
||||
# QuantityValue for explanation why it's needed)
|
||||
belongs_to :measurement, inverse_of: :readouts, polymorphic: true, required: true,
|
||||
foreign_key: 'registry_id', foreign_type: 'registry_type'
|
||||
|
||||
# Uniqueness NOT validated here, see Value for explanation
|
||||
#validates :quantity, uniqueness: {scope: [:measurement_id, :unit_id]}
|
||||
|
||||
@@ -10,5 +10,16 @@ class Target < ActiveRecord::Base
|
||||
# TODO: validate thresholds count according to condition type
|
||||
validates :condition, inclusion: {in: [:<, :<=, :>, :>=, :==]}
|
||||
validates :scope, inclusion: {in: [:day], if: -> { thresholds.first.domain == :diet }}
|
||||
validates :effective_from, presence: {unless: goal?}, absence: {if: goal?}
|
||||
validates :effective_from, presence: {unless: -> { goal.present? }},
|
||||
absence: {if: -> { goal.present? }}
|
||||
|
||||
after_initialize do
|
||||
if new_record?
|
||||
self.condition = :<
|
||||
end
|
||||
end
|
||||
|
||||
def arity
|
||||
BigDecimal.method(condition).arity
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
class Threshold < QuantityValue
|
||||
belongs_to :target, foreign_key: 'registry_id', foreign_type: 'foreign_type',
|
||||
inverse_of: :thresholds, polymorphic: true, required: true
|
||||
# Need to specify polymorphic association so :registry_type gets written (see
|
||||
# QuantityValue for explanation why it's needed)
|
||||
belongs_to :target, inverse_of: :thresholds, polymorphic: true, required: true,
|
||||
foreign_key: 'registry_id', foreign_type: 'registry_type'
|
||||
|
||||
validates :value, numericality: true
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user