class Ingredient < ActiveRecord::Base include TokenizedLike validates :name, presence: true validates :density, density: true, allow_blank: true 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.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