diff --git a/app/helpers/body_trackers_helper.rb b/app/helpers/body_trackers_helper.rb index c568e32..16964c3 100644 --- a/app/helpers/body_trackers_helper.rb +++ b/app/helpers/body_trackers_helper.rb @@ -61,7 +61,7 @@ module BodyTrackersHelper single_columns = [] spec[1..-1].each_with_index do |row, i| row.each do |q, span| - # Current span nil and previous span == 1 + # Current span is nil and previous span == 1 if span.nil? && (spec[i][q] == 1) spec[i][q] = -(spec.length - i) single_columns << q diff --git a/app/models/quantity.rb b/app/models/quantity.rb index a825e0e..36c3ce1 100644 --- a/app/models/quantity.rb +++ b/app/models/quantity.rb @@ -13,11 +13,20 @@ class Quantity < ActiveRecord::Base has_many :exposures, dependent: :destroy has_one :formula, inverse_of: :quantity, dependent: :destroy, validate: true - accepts_nested_attributes_for :formula, allow_destroy: true, reject_if: proc { |attrs| - attrs['code'].blank? - } + accepts_nested_attributes_for :formula, allow_destroy: true, + reject_if: proc { |attrs| attrs['code'].blank? } - validates :name, presence: true, uniqueness: {scope: :project_id} + validates :name, presence: true + # Quantity :name uniqueness relaxed to formulas unambiguity + validate if: -> { name_changed? } do + formulas = project.formulas.where('formulas.code LIKE ?', "%#{name}%").includes(:quantity) + # FIXME: should actually parse formulas in formulas and check for exact name match; + # current code is just quick'n'dirty partial solution + if formulas.exists? + quantity_names = formulas.map { |f| "'#{f.quantity.name}'" }.join(',') + errors.add(:name, :name_ambiguous, names: quantity_names) + end + end validates :domain, inclusion: {in: domains.keys} validate if: -> { parent.present? } do errors.add(:parent, :parent_domain_mismatch) unless domain == parent.domain diff --git a/config/locales/en.yml b/config/locales/en.yml index fa29439..a5af9ff 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -44,6 +44,8 @@ en: attributes: parent: parent_domain_mismatch: 'parent quantity has to be in the same domain' + name: + name_ambiguous: 'name creates ambiguity in quantity formulas for: %{names}' formula: attributes: code: diff --git a/lib/body_tracking/project_patch.rb b/lib/body_tracking/project_patch.rb index 44899f4..8bc992b 100644 --- a/lib/body_tracking/project_patch.rb +++ b/lib/body_tracking/project_patch.rb @@ -2,6 +2,7 @@ module BodyTracking::ProjectPatch Project.class_eval do has_many :sources, dependent: :destroy has_many :quantities, -> { order "lft" }, inverse_of: :project, dependent: :destroy + has_many :formulas, through: :quantities has_many :units, dependent: :destroy has_many :foods, -> { order "foods.name" }, dependent: :destroy,