2012-03-30 34 views
8

Hedef ağacı oluşturmak için ataları kullanırım. Bu ağacın içeriğini json kullanarak tarayıcıya göndermek istiyorum.Ancestry'den json ağacı nasıl oluşturulur

Benim denetleyicisi şu şekildedir:

{"#<Goal:0x7f8664332088>":{"#<Goal:0x7f86643313b8>":{"#<Goal:0x7f8664331048>":{"#<Goal:0x7f8664330c10>":{}},"#<Goal:0x7f8664330e68>":{}},"#<Goal:0x7f86643311b0>":{}},"#<Goal:0x7f8664331f70>":{},"#<Goal:0x7f8664331d18>":{},"#<Goal:0x7f8664331bd8>":{},"#<Goal:0x7f8664331a20>":{},"#<Goal:0x7f86643318e0>":{},"#<Goal:0x7f8664331750>":{},"#<Goal:0x7f8664331548>":{"#<Goal:0x7f8664330aa8>":{}}} 

nasıl json içinde Hedef nesnelerin içeriğini işleyebilen: Ben json dosyasını açtığınızda

@goals = Goal.arrange 
respond_to do |format| 
    format.html # index.html.erb 
    format.xml { render :xml => @goals } 
    format.json { render :json => @goals} 
end 

, bu çıktıyı almak dosya? @goals sıralı karma olduğu için,

@goals.map! {|goal| {:id => goal.id.to_s} 

ama çalışmıyor:

Bunu denedim.

+1

olarak

(4 boşlukla girinti ya da ters tırnakların ile çevreleyen [ '\']) rasgele '<' and '>' s çıkarmak gerekmez. http://stackoverflow.com/editing-help –

+0

Teşekkür ederiz. Onu düzeltti. –

cevap

10

Kullanıcı tejo'dan https://github.com/stefankroes/ancestry/issues/82 numaralı telefondan yardım aldım.

def self.json_tree(nodes) 
    nodes.map do |node, sub_nodes| 
     {:name => node.name, :id => node.id, :children => Goal.json_tree(sub_nodes).compact} 
    end 
end 

ve sonra böyle denetleyici görünmesi:

@goals = Goal.arrange 
respond_to do |format| 
    format.html # index.html.erb 
    format.xml { render :xml => @goals } 
    format.json { render :json => Goal.json_tree(@goals)} 
end 
+2

Atasözüne ihtiyacınız yok gibi gözüküyor o zaman – SET

+1

Mesajları günlüklere giren tek kişi ben miyim? 'N + 1 Sorgu algılandı Dizin => [: children] Bulunduğunuza ekleyin:: includes => [: children] N + 1 Sorgu yöntemi çağrı yığını ' ' closure_tree' kullanıyorum. – cantonic

0

den esinlenerek

çözüm hedefi modelinde bu yöntemi koymaktır Geçen gün bu soruna rastladım (ancestry 2.0.0). Johan'in ihtiyacım için cevabını değiştirdim. Ancestry kullanarak üç modelim var, bu yüzden üç modele json_tree eklemek yerine bir as_json yöntemi eklemek için OrderedHash'i genişletmek anlamlı oldu.

Bu iş parçacığı çok yardımcı olduğu için, bu değişikliği paylaşacağımı düşündüm. ActiveSupport için bir modül veya maymun yama olarak

Seti bu kadar :: OrderedHash

def as_json(options = {}) 
    self.map do |k,v| 
     x = k.as_json(options) 
     x["children"] = v.as_json(options) 
     x 
    end 
end 

Biz modelini arayıp varsayılan json davranıştır kullanın. Emin değilim numaralı telefonu arayarak _json veya numaralı telefonu arayarak _json. Burada as_json kullandım ve kodumda çalışıyor. kontrol biçim kodu kodu ise

... 
format.json { render :json => @goal.arrange} 
... 
İlgili konular