2012-03-30 16 views
8

मैं लक्ष्यों का पेड़ बनाने के लिए वंश का उपयोग करता हूं। मैं जेसन का उपयोग कर ब्राउज़र में उस पेड़ की सामग्री भेजना चाहता हूं।पूर्वजों से जेसन पेड़ कैसे उत्पन्न करें

मेरे नियंत्रक इस तरह है:

{"#<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>":{}}} 

मैं कैसे json में लक्ष्य-वस्तुओं की सामग्री प्रदान कर सकते हैं:

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

जब मैं json फ़ाइल खोलने के लिए, मैं इस आउटपुट प्राप्त फाइल?

मैं इस की कोशिश की है:

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

लेकिन यह काम नहीं करता है, के बाद से @goals एक आदेश दिया हैश है।

+1

आप प्रारूप कोड कोड के रूप में अगर में (4 रिक्त स्थान से मांगपत्र, या बैकटिक साथ चारों ओर [ '\' ']) आप बेतरतीब ढंग से दूर करने के लिए' '<' and '> रों जरूरत नहीं है। http://stackoverflow.com/editing-help –

+0

धन्यवाद। ठीक कर दिया। –

उत्तर

10

मुझे https://github.com/stefankroes/ancestry/issues/82 पर उपयोगकर्ता tejo से कुछ मदद मिली।

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 

और उसके बाद इस तरह नियंत्रक देखो बनाने:

@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

ऐसा लगता है कि आपको पूर्वजों की आवश्यकता नहीं है तो – SET

+1

क्या मैं अकेला हूं जो लॉग में संदेश प्राप्त करता है? 'एन + 1 क्वेरी का पता चला निर्देशिका => [: बच्चों] अपने खोजक में जोड़ें:: शामिल => [: बच्चों] एन + 1 क्वेरी विधि कॉल स्टैक' मैं 'closure_tree' का उपयोग कर रहा हूं। – cantonic

0

से प्रेरित होकर

समाधान लक्ष्य मॉडल में इस विधि डाल करने के लिए है मैं इस समस्या में दूसरे दिन (वंश 2.0.0) भाग गया। मैंने अपनी जरूरतों के लिए जोहान के जवाब को संशोधित किया। मेरे पास पूर्वजों का उपयोग करके तीन मॉडल हैं, इसलिए यह ऑर्डर्ड हैश को तीन मॉडलों में json_tree जोड़ने के बजाय as_json विधि जोड़ने के लिए समझ में आया।

चूंकि यह धागा इतना उपयोगी था, मैंने सोचा कि मैं इस संशोधन को साझा करूंगा।

ActiveSupport के लिए एक मॉड्यूल या बंदर पैच के रूप में

सेट इस अप :: OrderedHash

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

हम मॉडल कॉल और यह डिफ़ॉल्ट json व्यवहार का उपयोग करें। निश्चित नहीं है कि मुझे से _json या _json के रूप में कॉल करना चाहिए। मैंने यहां as_json का उपयोग किया है और यह मेरे कोड में काम करता है।

नियंत्रक

... 
format.json { render :json => @goal.arrange} 
... 
संबंधित मुद्दे