2012-04-26 9 views
10

मैं एक समस्या में भाग रहा हूं जहां मैं as_json विधि के साथ काम कर रहा हूं, और जेएसओएन और में ऑब्जेक्ट को कुशलता से वापस कैसे करें, यह JSON के रूप में ऑब्जेक्ट से संबंधित है, जहां संबंधित_to ऑब्जेक्ट का अपना संबंधित_to ऑब्जेक्ट है। कोड शायद इसे बेहतर समझाएगा।रेल्स as_json मुद्दा - नेस्टेड ऑब्जेक्ट्स को कुशलता से कैसे शामिल किया जाए?

नहीं-कार्य रास्ता

चेतावनी वर्ग

class Alert < ActiveRecord::Base 
    belongs_to :message 
    # for json rendering 
    def as_json(options={}) 
     super(:include => :message) 
    end 
end 

संदेश वर्ग

def as_json(options={}) 
    super(methods: [:timestamp, :num_photos, :first_photo_url, :tag_names], 
      include: { camera: { only: [:id, :name] }, 
         position: { only: [:id, :name, :address, :default_threat_level ]}, 
         images: { only: [:id, :photo_url, :is_hidden]} }) 
    end 

यह पहली की स्थापना के साथ समस्या यह है कि जब मैं एक चेतावनी वस्तु है और

पर कॉल करें
alert.as_json() 

मैं चेतावनी से सभी विशेषताओं और संदेश से सभी विशेषताओं मिलता है, लेकिन संदेश से अन्य विशेषताओं है कि मैं चाहता हूँ, कैमरा, स्थान, आदि

यहाँ की तरह से कोई भी है "यह काम कर रहा, लेकिन शायद उचित नहीं डिजाइन तरीका "

चेतावनी कक्षा

class Alert < ActiveRecord::Base 

    belongs_to :message 

    # for json rendering 
    def as_json(options={}) 
     super().merge(:message => message.as_json) 
    end 
end 

संदेश कक्षा

# for json rendering 
    def as_json(options={}) 
    super(methods: [:timestamp, :num_photos, :first_photo_url, :tag_names]) 
      .merge(:camera => camera.as_json) 
      .merge(:position => position.as_json) 
      .merge(:images => images.as_json) 
    end 

इस दूसरे सेटअप में, मुझे संदेश के सभी घोंसले वाले गुण मिलते हैं जैसे मैं चाहता हूं।

मेरा सवाल, क्या मुझे कुछ रेल कन्वेंशन ठीक से करने के लिए याद आ रही है? ऐसा लगता है कि एक आसान तरीका होगा/होना चाहिए।

उत्तर

3

रेल का आप किस संस्करण का उपयोग कर रहे हैं? यह रेल के पुराने संस्करणों में एक ज्ञात बग है, माना जाता है कि this pull request के साथ तय किया गया है। आपका वाक्यविन्यास मेरे लिए सही दिखता है, तो शायद यह आपकी समस्या है?

एक तरफ के रूप में, आप जोस वैलीम (रेल कोर सदस्य) से नए active_model_serializers को भी चेकआउट करना चाह सकते हैं। यह कम से कम आपको अपने मुद्दे के चारों ओर एक और सुरुचिपूर्ण तरीके से काम करने में सक्षम बनाता है।

+0

वैसे ऐसा लगता है कि उन्होंने इसे पुल अनुरोध के साथ तय किया है, लेकिन इसे किसी संस्करण में कभी नहीं खींचा है।लिंक के लिए धन्यवाद, यह कुछ मुद्दों को मंजूरी दे दी। – bluedevil2k

+1

रिकॉर्ड के लिए, मुझे उस पीआर से क्या मिला है: 1) जेसन एपीआई (मैं सक्रिय मॉडल सीरियलाइज़र का पक्ष लेता हूं) के लिए एक विशिष्ट मणि का उपयोग करने का प्रयास करता हूं 2) यदि आप नहीं चाहते/नहीं कर सकते हैं, तो 'serialized_hash ओवरराइड करें आपके सभी मॉडलों में 'as_json' के बजाय। 'Serialized_hash' द्वारा बस 'as_json' को प्रतिस्थापित करें। आपके मॉडल सही निर्भरताओं को सही ढंग से प्रस्तुत करेंगे। – kikito

+0

धन्यवाद kikito, मामूली सुधार, यह 'serializable_hash' – trans1t

1

मैं आपको आरएबीएल (रुबी एपीआई बिल्डर भाषा के लिए खड़ा) रत्न (railscast, github) पर एक नज़र डालने की सलाह दूंगा। यह आपको टेम्पलेट्स (जैसे हैमल या कॉफीस्क्रिप्ट करता है) में आपके JSON (और XML) प्रतिक्रिया की संरचना को परिभाषित करने के लिए एक डीएसएल प्रदान करता है। यह आंशिक भी समर्थन करता है।

7

मेरे लिए सबसे अच्छा जवाब serializable_hash का उपयोग कर रहा था। @किकिटो ने अपनी टिप्पणी में इस पर स्पर्श किया, लेकिन एक टाइपो था जिसने इसे काम करने से रोका। यह नहीं है, यह serializable_hash है।

सचमुच केवल as_jsonserializable_hash के साथ बदलें और यह बग दूर हो गया है। (यह अभी भी आज के रेल 4.0.2 में तय नहीं है)। आपको बाद में एक एक्सएमएल एपीआई लागू करने में आसान समय होने का लाभ भी मिलता है (कुछ लोग अभी भी उन का उपयोग करते हैं!)।

+1

धन्यवाद, मेरे लिए काम किया – toby

संबंधित मुद्दे