1
0
This repository has been archived on 2023-12-07. You can view files and clone it, but cannot push or open issues or pull requests.
body_tracking/app/models/ingredient.rb
cryptogopher ced06a25bc Added :meals and :compositions_ingredients tables
Changed Column -> QuantityColumn
Updated :ingredients table to handle recipes
2020-04-13 01:11:34 +02:00

51 lines
1.4 KiB
Ruby

class Ingredient < ActiveRecord::Base
enum group: {
other: 0,
dish: 1,
recipe: 2,
meat: 3
}
# Has to go before any 'dependent:' association
before_destroy do
# FIXME: disallow destruction if any object depends on this quantity
nil
end
belongs_to :project, required: true
belongs_to :ref_unit, class_name: 'Unit', required: true
belongs_to :source, required: false
has_many :nutrients, inverse_of: :ingredient, dependent: :destroy, validate: true
validates :nutrients, presence: true
accepts_nested_attributes_for :nutrients, allow_destroy: true, reject_if: proc { |attrs|
attrs['quantity_id'].blank? && attrs['amount'].blank?
}
# Nutrient quantity_id uniqueness check for nested attributes
validate do
quantities = self.nutrients.reject { |n| n.marked_for_destruction? }
.map { |n| n.quantity_id }
if quantities.length != quantities.uniq.length
errors.add(:nutrients, :duplicated_quantity)
end
end
validates :name, presence: true, uniqueness: {scope: :project_id}
validates :ref_amount, numericality: {greater_than: 0}
validates :group, inclusion: {in: groups.keys}
after_initialize do
if new_record?
self.ref_amount ||= 100
units = self.project.units
self.ref_unit ||= units.find_by(shortname: 'g') || units.first
self.group ||= :other
self.hidden = false if self.hidden.nil?
end
end
def toggle_hidden!
self.toggle!(:hidden)
end
end