1
0

Fix migration of default quantities

Allow Quantity formula to be nil but not blank
Add computed energy quantity
Reverse default quantities deletion order
This commit is contained in:
cryptogopher 2019-11-15 00:04:34 +01:00
parent 0e5a53b4b9
commit 3ce5d5c940
4 changed files with 134 additions and 125 deletions

View File

@ -59,6 +59,7 @@ class QuantitiesController < ApplicationController
private
def quantity_params
params[:quantity].delete(:formula) if params[:quantity][:formula].blank?
params.require(:quantity).permit(
:domain,
:parent_id,

View File

@ -15,7 +15,7 @@ class Quantity < ActiveRecord::Base
validate if: -> { parent.present? } do
errors.add(:parent, :parent_domain_mismatch) unless domain == parent.domain
end
validates :formula, formula: true
validates :formula, formula: {allow_nil: true}
after_initialize do
if new_record?

View File

@ -1,4 +1,5 @@
class LoadDefaults < ActiveRecord::Migration
def change
reversible do |dir|
dir.up do
Unit.create project: nil, shortname: "g", name: "gram"
@ -13,7 +14,7 @@ class LoadDefaults < ActiveRecord::Migration
e = Quantity.create project: nil, domain: :diet, parent: nil, name: "Energy",
description: "Total energy", primary: true
Quantity.create project: nil, domain: :diet, parent: nil, name: "Proteins",
p = Quantity.create project: nil, domain: :diet, parent: nil, name: "Proteins",
description: "Total amount of proteins", primary: true
f = Quantity.create project: nil, domain: :diet, parent: nil, name: "Fats",
@ -121,13 +122,20 @@ class LoadDefaults < ActiveRecord::Migration
v21 = Quantity.create project: nil, domain: :diet, parent: v1, name: "Vitamin K",
description: ""
# Calculated quantities go at the and to make sure dependencies exist
e1 = Quantity.create project: nil, domain: :diet, parent: e, name: "Calculated",
description: "Total energy calculated from macronutrients", primary: true,
formula: "4*Proteins + 9*Fats + 4*Carbohydrates"
Source.create project: nil, name: "nutrition label",
description: "nutrition facts taken from package nutrition label"
end
dir.down do
Unit.where(project: nil).delete_all
Quantity.where(project: nil).delete_all
Source.where(project: nil).delete_all
Quantity.where(project: nil).delete_all
Unit.where(project: nil).delete_all
end
end
end
end

View File

@ -7,7 +7,7 @@ module BodyTracking
class InvalidFormula < RuntimeError; end
class Formula
def initialize(project, formula)
@project = project
@project_quantities = Quantity.where(project: project)
@formula = formula
@paramed_formula = nil
@quantities = nil
@ -79,7 +79,7 @@ module BodyTracking
# 4th: check if identifiers used in formula correspond to existing quantities
identifiers.uniq!
quantities = @project.quantities.where(name: identifiers)
quantities = @project_quantities.where(name: identifiers)
quantities_names = quantities.pluck(:name)
(identifiers - quantities_names).each do |q|
errors << [:unknown_quantity, {quantity: q}]