class RecipeIngredient < ActiveRecord::Base belongs_to :ingredient belongs_to :recipe, inverse_of: :recipe_ingredients validates :sort_order, presence: true def name if self.ingredient_id.present? self.ingredient.name else super end end def display_name str = [quantity, units, name].delete_if { |i| i.blank? }.join(' ') str << ", #{preparation}" if preparation.present? str end def scale(factor, auto_unit = false) if factor.present? && self.quantity.present? && factor != '1' value_unit = UnitConversion.parse(self.quantity, self.units) value_unit = value_unit.scale(factor) if auto_unit value_unit = value_unit.auto_unit end self.quantity = value_unit.pretty_value self.units = value_unit.unit.to_s end end def to_metric return unless self.quantity.present? value_unit = UnitConversion.parse(self.quantity, self.units) value_unit = value_unit.to_metric self.quantity = value_unit.pretty_value self.units = value_unit.unit.to_s end def to_standard return unless self.quantity.present? value_unit = UnitConversion.parse(self.quantity, self.units) value_unit = value_unit.to_standard self.quantity = value_unit.pretty_value self.units = value_unit.unit.to_s end def to_volume return unless self.quantity.present? if ingredient && ingredient.density density = UnitConversion.parse(ingredient.density) if density.density? value_unit = UnitConversion.parse(self.quantity, self.units) value_unit = value_unit.to_volume(density) self.quantity = value_unit.pretty_value self.units = value_unit.unit.to_s end end end def to_mass return unless self.quantity.present? if ingredient && ingredient.density density = UnitConversion.parse(ingredient.density) if density.density? value_unit = UnitConversion.parse(self.quantity, self.units) value_unit = value_unit.to_mass(density) self.quantity = value_unit.pretty_value self.units = value_unit.unit.to_s end end end def can_convert_to_grams? if self.quantity.present? && self.units.present? value_unit = UnitConversion.parse(self.quantity, self.units) value_unit.mass? || (value_unit.volume? && self.ingredient && self.ingredient.density.present?) else false end end def to_grams value_unit = UnitConversion.parse(self.quantity, self.units) gram_unit = value_unit.convert('g', self.ingredient ? self.ingredient.density : nil) gram_unit.raw_value end end