2008-09-03 13 views
1

Bir Ruby on Rails'in acts_as_nested_set öğesindeki herhangi bir düğümden, yineleme kullanılmadan JSON hashını geri döndürmenin hızlı ve temiz bir yolu var mı?Ruby, bir acts_as_nested_set dosyasını bir JSON hashına özensiz bir şekilde dönüştürebilir mi?

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 

cevap

2

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

+0

İyi bir yanıt, ama bunu yapmak için yinelemeli veya süslü bir Ruby yolu daha arıyordum. – hoyhoy

1

JSONifier ;-) için bir egzersiz bırakın daha verimli olup olmadığı

class Node < ActiveRecord::Base 
    has_many :products 
    def json_hash 
    to_hash.to_json 
    end 

    def to_hash 
    if children.size > 0 
     children.collect { |node| { node.name => node.to_hash } 
    else 
     { node.name => node.products.find(:all).collect!(&:name) } 
    end 
    end 
end 

hale gelebilir!

node.to_json(:include=>{:products=>{:include=>:product_parts}}) 
İlgili konular