2016-04-14 25 views
0

yıkmak I has_many :through ilişkiyi kullanarak kendi kendine atıfta veritabanı yaptı.Ruby döngü yapmak bir dizi/karma

Bir ürünle başlayan ve her ürünün tüm bileşenlerini ve en basit duruma geçen bir döngü yazmayı deniyorum. Amaç, herhangi bir ürüne giren tüm temel ürünlerin bir dizisini iade etmektir, böylece karton 12 yumurta döndürür ve daire 192 Yumurta döndürür.

ben bir vuruş verdi ve bu bende ne kadar var, ne döngüyü kullanarak geldiğinde

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 

Ben bütün bir kavram özlüyorum. Herhangi birinin, bunun gerektirdiği kavramların adı hakkında bir tavsiyesi varsa, çok minnettar olurum. Daha açık olmak için, veritabanının ilişkilerini kopyaladım.

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

"product_source" ve "product_component" öğelerinin ne anlama geldiğini anlatabilir misiniz? –

+0

sınıf Ürün : bileşenlerin uç sınıfı Bileşen "product_component_id" end – user1659305

+0

Bunu uygun bir şekilde biçimlendirilecekleri yerine, soru gövdesinde yayınlayabilir misiniz? Teşekkürler! –

cevap

0

Diziyi oluşturmak için each_with_object kullanmanızı öneririz. Bu şekilde, results değişkenine bile ihtiyacınız yoktur, sadece her_with_object öğesinin dönüş değerini döndürürsünüz.

Ünite, karton ve düz arasında nasıl ayrım yaparsınız?

+0

Teşekkürler, ben kontrol edeceğim! Bu basitleştirilmiş örnek için product.name, farklılaştırıcı olması amaçlanmıştır. – user1659305

0

Eğer doğru anlamak, her madde nil, Carton veya Flat olabilen bir component sahiptir? Ve bir karton her zaman 12 birim ve bir düz 16 karton içerir?

: Ve bu durumda madde (? Yumurta, süt, vs)

türünü bir source, ben Ingredient bir çift yardımcı yöntemleri bir as_unit sınıf yöntemi ve unit_quantity örnek yöntemini tanımlamak istiyorum

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 

Bu şekilde, olmaya products_breakdown yazabilirsiniz:

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

Bu yol açmalıdır içinde:

$ 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>] 

Aradığın şey bu mu? Sorunu tam olarak anladığımdan emin değilim ...

+0

Burada verdiğiniz detaylara minnettarım. Maalesef hala bu dünyada en iyi soruları nasıl sorduğumu öğreniyorum. Veritabanındaki tüm ilişkileri koymanın amacı, uygulamada, sistemde onları kodlayan kodlamanın mümkün olmadığı noktaya bazen değişebilen yüzlerce ilişkiyi juggle etmesi gerektiğidir. – user1659305