मैं एक समस्या में भाग रहा हूं जहां मैं 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
इस दूसरे सेटअप में, मुझे संदेश के सभी घोंसले वाले गुण मिलते हैं जैसे मैं चाहता हूं।
मेरा सवाल, क्या मुझे कुछ रेल कन्वेंशन ठीक से करने के लिए याद आ रही है? ऐसा लगता है कि एक आसान तरीका होगा/होना चाहिए।
वैसे ऐसा लगता है कि उन्होंने इसे पुल अनुरोध के साथ तय किया है, लेकिन इसे किसी संस्करण में कभी नहीं खींचा है।लिंक के लिए धन्यवाद, यह कुछ मुद्दों को मंजूरी दे दी। – bluedevil2k
रिकॉर्ड के लिए, मुझे उस पीआर से क्या मिला है: 1) जेसन एपीआई (मैं सक्रिय मॉडल सीरियलाइज़र का पक्ष लेता हूं) के लिए एक विशिष्ट मणि का उपयोग करने का प्रयास करता हूं 2) यदि आप नहीं चाहते/नहीं कर सकते हैं, तो 'serialized_hash ओवरराइड करें आपके सभी मॉडलों में 'as_json' के बजाय। 'Serialized_hash' द्वारा बस 'as_json' को प्रतिस्थापित करें। आपके मॉडल सही निर्भरताओं को सही ढंग से प्रस्तुत करेंगे। – kikito
धन्यवाद kikito, मामूली सुधार, यह 'serializable_hash' – trans1t