12

biraz yardım eğer.yazma dernekleri

'Ürün' sınıfımla rutin bir ilişki kurmak istiyorum. Bir ürünüm diğer ürünler için ana ürün olabilir. Sorularım, modelimde bu ilişkiyi nasıl oluşturabilirim?

bu uygun olur mu?

has_many :products 
belongs_to :product 

cevap

38

önerdiğiniz çözümü ile yanlış mantıksal şey yoktur. Ancak, muhtemelen böyle bir şey yapmak gerekir: Temelde derin altından üst ve alt ürünlerin şubelerinde bir ürünle, potansiyel olarak pek çok düzeyde bir "ağaç" depolayacaksanız

belongs_to :parent, class_name: "Product", foreign_key: "parent_id" 
has_many :children, class_name: "Product", foreign_key: "parent_id" 

.

Örneğinizdeki strateji, Adjacency List olarak bilinir. Herhangi bir kaydın doğrudan ebeveyni ve doğrudan torunlarını bulmak kolaydır. Ancak, TÜM adananların torunları (torun torunları dahil) zor olabilir ve ağacın daha derin olduğu için daha da zorlaşır.

Sıklıkla kullanılan bir seçenek, her kaydın nesne hakkındaki bilgileri "sol" ve "sağ" olarak kaydettiği Nested Set şeklindedir. Bu, ne kadar büyük, ne kadar hızlı olursa olsun (veya tek bir sorguda en azından verimli bir şekilde) bir ağaç inşa etmenizi sağlar. Bununla birlikte, daha karmaşıktır ve bir kaydı eklemek genellikle eklemekte olduğunuz kaydın sağında tüm kayıtlarını yeniden hesaplamak ve güncellemek anlamına gelir.

Üçüncü bir seçenek (ve orta zemin tartışmalı bir çeşit) nesneler ağacında onların tüm yolu saklamak Path Enumeration kullanıyor. Yani, böyle bir ağaç verilir:

A 
/\ 
B C 
    | 
    D 

A boş yol (hayır ebeveyn) olurdu, B ve C yolunu A olurdu, D yolunu A/C olurdu. Çoğu ekleme işlemi bu çözümle nispeten ucuzdur ve sorgulama oldukça kolaydır. Ancak, ağacın etrafında hala karmaşık ve hareketli nesneler pahalıya mal olabilir.

Closure Tables gibi başka seçenekler de vardır.

Basit bir Komşuluk Listesi ihtiyaçlarınız için çalışıyorsa, bununla devam edin. Anlamak en basit ve en kolay olanıdır. İç içe geçmiş setleri uygulayan taşlar ve belki de diğer bazı ağaç desenleri için de, bu rotayı izlerseniz tüm ağır yüklerinizi kendiniz yapmanız gerekmez.

+0

wow! harika cevap, sizin gibi insanlar bu gibi harika siteler yapar. Teşekkürler! –

+0

[Bu yanıt] (http://stackoverflow.com/a/11162888/638425) Kapanma Tabloları desenini uygularken kullanışlı olabilir. – elhoyos

+0

Harika cevap, bunun için teşekkürler! Tek bir modeldeki yazılarda yorum yapmak gibi şeyler yapmak yararlıdır. – Tomanow