2012-02-08 9 views
15

मुझे कामों में एक आरओआर परियोजना मिली है। मेरे मॉडल के लागू अनुभाग यहां दिए गए हैं।रेल - तालिका डेटा में शामिल होने के द्वारा क्रमबद्ध करें

होम

has_many :communities, :through => :availabilities 
has_many :availabilities, :order => "price ASC" 

समुदाय

has_many :homes, :through => :availabilities 
has_many :availabilities 

उपलब्धता

belongs_to :home 
belongs_to :community 

डेटाबेस में "की उपलब्धता" तालिका तो अब मैं

@home.availabilities.each do |a| 
    a.community.name 
    a.price 

कॉल और के रूप में मैं चाहता हूँ की उपलब्धता डेटा कीमत द्वारा आदेश दिया वापस प्राप्त कर सकते अतिरिक्त डेटा स्तंभ "मूल्य"

है। मेरा सवाल यह है:

क्या avaliabilities.first.price (पहले = सबसे कम) द्वारा स्वचालित रूप से घरों को ऑर्डर करने का कोई तरीका है? शायद default_scope :order के साथ कुछ?

उत्तर

17

मैं default_scope का उपयोग करने से बचने के लिए सुझाव दूंगा, खासतौर पर किसी अन्य तालिका पर कीमत की तरह। हर बार जब आप उस टेबल का उपयोग करेंगे, तो शामिल हों और ऑर्डर करना संभवतः जटिल प्रश्नों में अजीब परिणाम दे रहा है और फिर भी आपकी क्वेरी को धीमा कर देगा।

scope :ordered, -> { includes(:availabilities).order('availabilities.price') } 

पुनश्च::

अपने आप में एक गुंजाइश है, यह आसान है और यह भी स्पष्ट है के साथ गलत कुछ भी नहीं है, तो आप इसे के रूप में सरल रूप में कर सकते हैं price

+1

क्या आपको जुड़ने के बजाय 'शामिल' का उपयोग करने की आवश्यकता है? – Jwan622

+0

निर्भर करता है, @TeWu अपने उत्तर में अंतर को समझाने में एक महान काम कर रहा है। विशेष रूप से टॉम डेलिमोर के ब्लॉग का लिंक अद्भुत है। – ecoologic

20

this related post से सहायता के साथ इसे समझ लिया।

मैं घर मॉडल से बाहर और उपलब्धता मॉडल में आदेश देने के लिए ले जाया गया:

उपलब्धता

default_scope :order => "price ASC" 

तब मैं घर मॉडल में उत्सुक लोड की उपलब्धता और कीमत के अनुसार क्रमबद्ध:

घर

default_scope :include => :availabilities, :order => "availabilities.price ASC" 
6

पर एक सूचकांक जोड़ने का ध्यान रखें @ ecoologic answer:

scope :ordered, -> { includes(:availabilities).order('availabilities.price') } 

महान है, लेकिन यह है कि includes सकता है उल्लेख किया जाना चाहिए, और कुछ मामलों में ऐसा करना चाहिए joins द्वारा प्रतिस्थापित किया जाना चाहिए। They both have their optimal use cases

व्यावहारिक दृष्टिकोण से दो मुख्य अंतर देखते हैं:

  1. includes भार जुड़े रिकॉर्ड (रों); इस मामले में Availability रिकॉर्ड। joins कोई भी संबंधित रिकॉर्ड लोड नहीं करें। इसलिए जब आप मॉडल में शामिल होने से डेटा का उपयोग करना चाहते हैं तो आपको includes का उपयोग करना चाहिए। कहीं price प्रदर्शित करें। दूसरी तरफ, joins का उपयोग किया जाना चाहिए यदि आप केवल क्वेरी में मॉडल के डेटा में शामिल होने का इरादा रखते हैं उदा। ORDER BY या WHERE खंड में।

  2. includes सभी रिकॉर्ड लोड करता है, जबकि joins केवल उन रिकॉर्ड को लोड करता है जो मॉडल में शामिल हैं। तो ओपी के मामले में, Home.includes(:availabilities) सभी घरों को लोड करेगा, जबकि Home.joins(:availabilities) केवल उन घरों को लोड करेगा जो कम से कम एक उपलब्धता से जुड़े हैं।

यह भी देखें this question