class Ingredient < ActiveRecord::Base 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