kullandığınız özyinelemeli çözüme farklı alternatifler gösterir ağacın enine bir wikipedia article yok:
İşte başvuru için özyinelemeli bir çözümdür. Bunları özel durumunuzda kullanmak zor olabilir, ancak mümkün olmalıdır.
Ancak, benim sorum şu, yineleme yerine yineleme kullanmak istediğiniz belirli bir neden var mı? Yinelemeli çözümlerin neredeyse hiç temiz olamayacağını düşünmüyorum. Ağaçlarınız o kadar büyük ki yığın alanınız tükeniyor (oldukça büyük olmalılar)? Aksi halde, yinelenen bir çözümün gerçekten daha hızlı olacağından emin değilim. Performans sorunları görmekte olup olmadıklarını
Ben, gerçi iyileştirilmesi için bir potansiyel görüyoruz ... ama raylar bilmiyorum, yüzden doğru olup olmadığından emin değilim:
bulmak yöntemi dönmek mu
yeni dizi? Eğer öyleyse, muhtemelen çağırmak istersiniz. .collect yerine, eğer buluntu bir dizi yaratırsa, sadece bir dizi yaratıyorsunuz ve onu toplamak için çağrıya atıyorsunuz (ki bu da bir dizi yaratıyor), ki bu kesinlikle çok verimli olmayacak ve sizi yavaşlatacak Orada büyük bir ağacınız varsa çok.
Yani
{ node.name => node.products.find(:all).collect(&:name) }.to_json
{ node.name => node.products.find(:all).collect!(&:name) }.to_json
DÜZENLEME hale gelebilir: Ayrıca, sağlamalarının sizin karmasını oluşturmak için daha verimli olabilir ve daha sonra saldırmak düştü 1'de json bütün olayları dönüştürmek, Yaptığın gibi, onu beğenme yerine dönüştürmek yerine.
Yani
class Node < ActiveRecord::Base
has_many :products
def json_hash
if children.size > 0
children.collect { |node| { node.name => node.json_hash }.to_json
else
{ node.name => node.products.find(:all).collect!(&:name) }.to_json
end
end
end
bu işleri ve ben
İyi bir yanıt, ama bunu yapmak için yinelemeli veya süslü bir Ruby yolu daha arıyordum. – hoyhoy