我使用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
答案 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
,可以是nil
,Carton
或Flat
?一个纸箱总共包含12个单位,还有一个单位16个纸箱?和source
,这是一种成分(鸡蛋,牛奶等?)
在这种情况下,我在Ingredient
,as_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>]
这就是你要找的东西吗?我不确定我完全理解你的问题......