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? # replace 'fl oz' with 'floz' description = description.gsub(/fl oz/i, 'floz') begin unit = UnitConversion.parse(description) if UnitConversion.volume?(unit) mass = Unitwise(grams, 'g') density = (mass / unit).convert_to(UnitConversion.normalize_unit_names('oz/cup')) return "#{density.value.round(4)} oz/cup" else return nil end rescue UnitConversion::UnparseableUnitError return nil end end end