2011-11-23 11 views
11

रेल 3 में एक दायरा करने की कोशिश कर रहा है।rail3 में बच्चों की गिनती के लिए rails3 गुंजाइश है

:book has_many :chapters 

मुझे स्कोप चाहिए: 10 अध्यायों के साथ किताबें वापस करने के लिए लंबा।

इस दायरे को कैसे व्यवस्थित करना है (काउंटर कैश के उपयोग के बिना)?

धन्यवाद!

class Book 
    scope :long, joins(:chapters). 
       select('books.id, count(chapters.id) as n_chapters'). 
       group('books.id'). 
       having('n_chapters > 10') 
end 

यह मदद करता है:

+0

क्यों कोई काउंटर कैश: इस उदाहरण के लिए, यह कुछ ऐसा हो सकता है? –

+0

क्या आप उस डेटाबेस के साथ पोस्ट/वर्णन कर सकते हैं जिसका आप उपयोग कर रहे हैं? मेरा मानना ​​है कि यह –

उत्तर

19

यह तुम जा मिलना चाहिए?

+0

के नीचे दिए गए उत्तरों में कुछ भ्रम पैदा कर रहा है यह जाने का तरीका है। केवल एक समस्या जो मैं चलाता हूं वह यह है कि गिनती विधि वास्तव में यहां अपेक्षित काम नहीं करती है। उदाहरण के लिए, Book.long.count प्रत्येक पुस्तक के लिए अध्यायों की गिनती के साथ हैश देता है, मुझे लगता है। आपको Book.long.all.count करना है। बहुत बुरा नहीं मुझे लगता है कि –

+3

यह सही दिखता है लेकिन मुझे एक त्रुटि मिल रही है: 'कॉलम "card_count" मौजूद नहीं है' (card_count मेरा n_chapters है)। 'होने' से सब कुछ ठीक से काम करता प्रतीत होता है, और जब मैं इसे सीधे SQL कंसोल में चलाता हूं तो card_count कॉलम निश्चित रूप से पॉप्युलेट किया जाता है ... –

+0

मुझे यकीन नहीं है कि यह अन्य स्टैक ओवरफ्लो पोस्ट को जोड़ने का अच्छा अभ्यास है या नहीं। लेकिन मुझे इस पोस्ट में एक ही समस्या है, लेकिन इसमें has_many ऑब्जेक्ट्स पर केवल कुछ विशेषताओं की आवश्यकता है। वास्तव में मदद की सराहना करेंगे http://stackoverflow.com/questions/31719184/rails-active-record-find-all-records-which-have-a-count-on-has-many-associati –

8

आह - ऊपर टिप्पणी में अपने खुद के सवाल का जवाब देने, मैं होने में गिनती डाल करने के लिए किया था:

class Book 
    scope :long, joins(:chapters). 
    select('books.id'). 
    group('books.id'). 
    having('count(chapters.id) > 10') 
end 
1

में रेल 4.0 इस संस्करण में काम करता है। आपको क्लॉज में() को गिनना होगा। ऐसा लगता है कि खंड होने से 'n_chapters' के रूप में नहीं देखा जाता है।

0

एक विकल्प एक सबक्वायरी बनाना है। जबकि शामिल होना अधिक सही है (और संभवतः बेहतर प्रदर्शन भी होता है), यदि आप समूहबद्ध करने का प्रयास करने वाले कई क्षेत्रों को जोड़ते हैं तो आप अजीब परिणामों के साथ समाप्त हो सकते हैं। एक सबक्वायरी बहुत कम घुसपैठिया है।

class Book 
    scope :with_chapters_count, -> { 
    select('books.*'). 
    select('(select count(chapters.id) from chapters where chapters.book_id = books.id) as chapters_count') 
    } 
    scope :long, -> { 
    with_chapters_count.where("chapters_count > 10") 
    } 
end 
संबंधित मुद्दे