Ruby do-loop来分解数组/哈希

时间:2016-04-14 05:56:44

标签: ruby-on-rails ruby database loops

我使用has_many :through关系创建了一个自引用数据库:

**Product**
name


**Ingredient**
quantity
product_id
product_component_id

我可以有一个鸡蛋,12个鸡蛋的纸盒和16个纸箱的单位。

我正在尝试编写一个以产品开头的循环,并将每个产品的所有组件分解为最基本的状态。目标是返回任何给定产品的所有基础产品的阵列,这样纸箱将返回12个鸡蛋,而公寓将返回192个鸡蛋。

我试了一下,这是我得到了多远:

def product_breakdown
  results = []
   ingredients.each do |ingredient|
     if ingredient.product_component_id == nil
        results += ingredient
     else
        Keep digging deeper?
     end
   end
  return results
end

在使用循环时,我错过了一个完整的概念。如果有人对这个概念的名称提出建议,我将非常感激。

编辑以便更清楚我复制了数据库的关系。

class Product < ActiveRecord::Base
    has_many :ingredients 
    has_many :product_components, :through => :ingredients 
end 

class Ingredient < ActiveRecord::Base
    belongs_to :product 
    belongs_to :product_component, class_name: "Product", :foreign_key => "product_component_id" 
end

2 个答案:

答案 0 :(得分:0)

我建议使用let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray let documentsDirectory = paths.objectAtIndex(0) as NSString let path = documentsDirectory.stringByAppendingPathComponent("MyFile.plist") data.writeToFile(path, atomically: true) 来构建数组。这样你甚至不需要each_with_object变量,只需返回each_with_object的返回值。

您如何区分单位,纸箱和单位?

答案 1 :(得分:0)

如果我理解正确,每种成分都有一个component,可以是nilCartonFlat?一个纸箱总共包含12个单位,还有一个单位16个纸箱?和source,这是一种成分(鸡蛋,牛奶等?)

在这种情况下,我在Ingredientas_unit类方法和unit_quantity实例方法上定义了几个辅助方法:

def unit_quantity
  case product_component_id
  when nil
    quantity
  when CARTON_COMPONENT_ID
    12 * quantity
  when FLAT_COMPONENT_ID
    192 * quantity
  end
end

def self.as_unit ingredients
  source_ids = ingredients.map(&:product_source_id).uniq
  raise "Can't join different types together" if source_ids.count != 1

  source_id = source_ids.first
  quantity = ingredients.reduce(0) { |total, ingredient| total += ingredient.unit_quantity }

  Ingredient.new quantity: quantity, product_component_id: nil, product_source_id: source_id
end

这样,您可以将products_breakdown重写为:

def products_breakdown ingredients
  ingredients.group_by(&:product_source_id).map do |_, ingredients|
    Ingredient.as_unit ingredients
  end
end

这应该导致:

$ ingredients
#=> [<Ingredient: 3 Cartons of Egg>, <Ingredient: 2 Flats of Milk>, <17 Units of Egg>]
$ product_breakdown ingredients
#=> [<Ingredient: 53 Units of Egg>, <Ingredient: 384 Units of Milk>]

这就是你要找的东西吗?我不确定我完全理解你的问题......