parsley/app/models/ingredient.rb

74 lines
1.6 KiB
Ruby

class Ingredient < ActiveRecord::Base
include TokenizedLike
belongs_to :user
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 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
self.ndbn = food.ndbn
self.water = food.water
self.protein = food.protein
self.lipids = food.lipid
self.carbohydrates = food.carbohydrates
self.ash = food.ash
self.kcal = food.kcal
self.fiber = food.fiber
self.sugar = food.sugar
self.density = calculate_density(food.gram_weight_1, food.gram_weight_desc_1) || calculate_density(food.gram_weight_2, food.gram_weight_desc_2)
end
def calculate_density(grams, description)
return nil if grams.blank? || description.blank?
begin
value_unit = UnitConversion.parse(description)
if value_unit.volume?
density_value = grams.to_d / value_unit.raw_value
density_units = "g/#{value_unit.unit.unit}"
density = UnitConversion.parse(density_value, density_units)
return density.convert('oz/cup').to_s
else
return nil
end
rescue UnitConversion::UnparseableUnitError
return nil
end
end
end