2013-03-20 7 views
7

मैं उत्सुक अपने संगठनों के साथ एक मॉडल वस्तु लोड हो रहा हूँ:रेल उत्सुक लोड हो रहा है और जहां खंड

user.posts.where(:topic => "x") 
:

user= User.includes(:posts).find(1) 

लेकिन तब कोड में कुछ बिंदुओं पर मैं कुछ इस तरह करना चाहते हैं

लेकिन यह फिर से क्वेरी को फिर से चलाता है। तो इसके बजाय मैंने सोचा कि मैं यह करूँगा:

user.posts.select{|post| post.topic == "x" } 

यह क्वेरी को दोबारा नहीं चलाता है। लेकिन मेरे पास कुछ प्रश्न हैं।

पहला, क्या यह करने का सही तरीका है?

दूसरा, मैं इस मामले में क्या चयन करता हूं इसके बारे में थोड़ा उलझन में हूं। क्योंकि जब मैं आखिरी पंक्ति चलाता हूं तब भी जब मैंने फ़ंक्शन शामिल नहीं किया है, पहली बार यह क्वेरी चलाता है और उसके बाद यदि मैं इसे फिर से चलाता हूं, तो ऐसा नहीं होता .. तो क्या कुछ प्रकार के कैशिंग शामिल हैं? क्योंकि जब मैं कहां उपयोग करता हूं यह हर बार क्वेरी चलाता है।

धन्यवाद।

उत्तर

14

select संख्यात्मक पर एक रूबी विधि है। पहली बार जब आप user के :posts संघ स्मृति में डेटाबेस से लोड किया जाएगा के लिए

user.posts.select{|post| post.topic == "x" } 

सभी Post उदाहरणों को चलाने; विशेष रूप से एक ActiveRecord संग्रह ऑब्जेक्ट में। select को इस संग्रह पर बुलाया जाता है, विशेषता के साथ विशेषता के साथ संग्रह में सभी Post उदाहरणों को फ़िल्टर करना जो "x" के अलावा कुछ भी है।

उपरोक्त रेखा को दूसरी बार चलाना डेटाबेस से फिर से क्वेरी नहीं करेगा, क्योंकि आपने पहले से ही posts स्मृति में लोड कर लिया है।


जब आप ऐसा करेंगे एक includes तरह

नीचे
user= User.includes(:posts).find(1) 

यह उत्सुक लोड प्रत्येक User उदाहरण के लिए :posts संबंध लौटे जा रहा है (इस मामले में, एक भी User जहां :id1 है)। अब आपके पास उपरोक्त पिछले खंड में वर्णित सभी Post मेमोरी में लोड किए गए उदाहरण हैं।

आप तो करते हैं जैसे

user.posts.where(:topic => "x") 

अब आप एक नई क्वेरी Post के खिलाफ किया, इस बार Post उदाहरणों खोजने जहां :topic"x" है और :user_id की :id है जहां चलाने के लिए रेल कह रहे हैं कुछ userwhere इन-मेमोरी एआरएल संग्रह पर "फ़िल्टर" की तरह काम नहीं करता है।


  • यदि आप किसी अन्य प्रश्न है कि बुरा से बचना चाहते हैं, select एक ठीक तरह से फिल्टर करने के लिए इन-स्मृति परिणाम सेट है।
    1. db लगाने और उन्हें स्मृति
    2. में स्मृति enumberable से अधिक पुनरावृत्ति में एक और अरेल संग्रह repopulating और रूबी
    3. साथ
  • एक फिल्टर चल:

  • आप जो तेजी से होता है खोजने के लिए मानक चला सकते हैं तुम कभी नहीं सभी संबंधित user के लिए :posts की जरूरत है, आप आसानी से मूल क्वेरी में शामिल कर सकते हैं इस

    user.includes(:posts).where("posts.topic = ?", 'x') 
    
+0

यह सही है, धन्यवाद! – user1069624

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