14

पृष्ठभूमि

मेरे पास गहरे घोंसले वाले संघों के साथ रेल आवेदन है।सक्रिय मॉडल सीरियलाइजर्स के साथ उत्सुक लोड एसोसिएशन

      .-< WorkPeriod 
Timecard -< Week -< Day -<--< Subtotal 
          `-< Adjustment 

-< (has many) 

मैं Active Model Serializer उपयोग कर रहा हूँ एपीआई बाहर का निर्माण।

क्लाइंट साइड पर मैं एक टाइमकार्ड और उसके सभी एसोसिएशन को एक शॉट में लोड करना चाहता हूं।

वर्तमान में मेरी serializers,, इस तरह दिखना

class TimecardSerializer < ActiveModel::Serializer 
    embed :ids, include: true 
    has_many :weeks 
end 
class WeekSerializer < ActiveModel::Serializer 
    embed :ids, include: true 
    has_many :days 
end 
# ... etc ... 

समस्या

यह सब काम करता है लगता है छोड़कर कुछ भी नहीं उत्सुक-लोडेड हो जाता है। तो यह प्रत्येक अनुरोध के लिए डेटाबेस में बहुत सी कॉल करने के समाप्त होता है। प्रत्येक सप्ताह के लिए, यह उस सप्ताह के दिनों के लिए एक अलग अनुरोध करता है। और प्रत्येक दिन, यह इसके कार्य_ अवधि, उप-योग, और समायोजन के लिए एक अलग अनुरोध करता है।

उत्तर

9

एक समाधान टाइमकार्डसेरियलाइज़र पर अपनी weeks विधि को परिभाषित करना है। वहां से आप .includes() उन सभी संगठनों को लोड कर सकते हैं जिन्हें आप लोड करना चाहते हैं।

class TimecardSerializer < ActiveModel::Serializer 
    embed :ids, include: true 
    has_many :weeks 

    def weeks 
    object.weeks.includes(days: [:sub_totals, :work_periods, :adjustments]) 
    end 
end 

सभी प्रश्न अभी भी लॉग में दिखाई देंगे लेकिन अधिकांश वास्तविक के बजाय कैश किए गए प्रश्न होंगे।

+1

यह एक संसाधन लोड करने के लिए ठीक है, लेकिन अगर इस धारावाहिक का उपयोग 'टाइमकार्ड' की सूची वापस करने के लिए किया जाता है तो काम नहीं करेगा। विशेष रूप से, 'सप्ताह' उत्सुकता से लोड नहीं किया जाएगा, हालांकि 'सप्ताह' संघ होंगे। – hjdivad

8

मुझे एक समान समस्या थी। मैंने इसे अपने नियंत्रक में तय किया। मुझे इसे धारावाहिक में डालने का विचार पसंद है, लेकिन इसे नियंत्रक में रखने से एरे 1 सीरियलाइज़र द्वारा बनाई गई एन + 1 सप्ताह की समस्या भी होती है।

Timecard.find(params[:id]).includes(weeks: [{ days: [:sub_totals, :work_periods, :adjustments] }]) 

और

Timecard.includes(weeks: [{ days: [:sub_totals, :work_periods, :adjustments] }]) 

अब उत्सुक लोड करना चाहिए और क्वेरी सिर्फ छह db हिट करने के लिए सीमा।

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