ö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.
wow! harika cevap, sizin gibi insanlar bu gibi harika siteler yapar. Teşekkürler! –
[Bu yanıt] (http://stackoverflow.com/a/11162888/638425) Kapanma Tabloları desenini uygularken kullanışlı olabilir. – elhoyos
Harika cevap, bunun için teşekkürler! Tek bir modeldeki yazılarda yorum yapmak gibi şeyler yapmak yararlıdır. – Tomanow