parsley/app/models/ingredient.rb
2016-10-14 12:19:00 -05:00

92 lines
1.6 KiB
Ruby

class Ingredient < ApplicationRecord
include TokenizedLike
belongs_to :user
has_many :ingredient_units, inverse_of: :ingredient, dependent: :destroy
accepts_nested_attributes_for :ingredient_units, allow_destroy: true
validates :name, presence: true
validates :density, density: true, allow_blank: true
scope :has_density, -> { where.not(density: nil) }
def self.search(query)
tokens = query.to_s.split(' ')
if tokens.empty?
Ingredient.none
else
Ingredient.matches_tokens(:name, tokens)
end
end
def custom_unit_weight(unit)
ingredient_units.each do |iu|
if iu.matches?(unit)
return UnitConversion::parse(iu.gram_weight, 'grams')
end
end
nil
end
def ndbn=(value)
@usda_food = nil
super
end
def usda_food
if self.ndbn.present?
@usda_food ||= UsdaFood.find_by_ndbn(self.ndbn)
else
nil
end
end
def usda_food_name
if usda_food
usda_food.long_description
end
end
def set_usda_food(food)
return unless food
copy_fields = [
:water,
:ash,
:protein,
:kcal,
:fiber,
:sugar,
:carbohydrates,
:calcium,
:iron,
:magnesium,
:phosphorus,
:potassium,
:sodium,
:zinc,
:copper,
:manganese,
:vit_c,
:vit_b6,
:vit_b12,
:vit_a,
:vit_e,
:vit_d,
:vit_k,
:cholesterol
]
copy_fields.each do |f|
self.send("#{f}=".to_sym, food.send(f.to_sym))
end
self.lipids = food.lipid
self.density = food.density_best_guess
end
end