2013-02-11 10 views
5

असल में, मैं अपने मॉडल पर एक संपत्ति जो एक और तालिका के मान के आधार पर सही या गलत रिटर्न में परिभाषित किया।रेलवे में एक विचार के लिए संबंधों पर फ़िल्टर किए गए परिणामों को वापस कैसे करें?

क्या मैं चाहता हूँ नियंत्रक में मेरी सूचकांक कार्रवाई केवल उन्हीं परिणाम है कि इस शर्त को पूरा वापस जाने के लिए है।

#What I've tried on my Controller: 
def index 
    @projects = Project.where(:is_available?) 
end 

#What I've on my Controller: 
def index 
    @projects = Project.all 
end 

#What I've on my Model: 
def is_available? 
    workers.count<2 ? true : false 
end 

धन्यवाद:

मैं इस कोशिश की।

उत्तर

10

क्यों अपने कोड काम नहीं करता है?

Project.where(:is_available?) 
जहां विधि में

यहाँ, आप तर्क का एक हैश या (SQL) की स्थिति की एक स्ट्रिंग पारित करने के लिए की है। आप यहां क्या करने की कोशिश कर रहे हैं उन सभी परियोजनाओं का चयन करना जहां विधि is_available है? सच आता है। समस्या यह है कि विधि is_available? एक रूबी विधि (अपने मॉडल में परिभाषित) है। चूंकि यह रूबी फ़ंक्शन है, इसलिए आप इसे एसक्यूएल के अंदर नहीं बुला सकते हैं। जहां विधि SQL शर्तों की अपेक्षा कर रही है, रूबी कोड नहीं।

(धन्यवाद टिप्पणी के लिए @benzado को)


आपकी समस्या का समाधान करने के लिए:

Project.joins(:workers) 
     .select('projects.*') 
     .group('projects.id') 
     .having('COUNT(workers.*) > 2') 
:

यह आप के लिए क्या देख रहे हैं, केवल db स्तर पर गणना की है

यह चाहिए के साथ जुड़े कम से कम 2 श्रमिकों होने सभी परियोजना देता है।


इसे कैसे सुधारें?

आप इस क्वेरी के गुंजाइश कर सकते हैं इसे हर जगह आसानी से उपयोग करने के लिए:

#in your controller 
def index 
    @projects = Project.having_more_than_x_workers(2) 
end 
+0

यह करने का यह सही तरीका है, लेकिन आप व्याख्या नहीं करते * क्यों * @ met.lord का कोड काम नहीं कर रहा था। इसे सुधारने के लिए मेरे उत्तर से कुछ भी कॉपी करने के लिए स्वतंत्र महसूस करें। – benzado

3

रेल क्वेरी तरीकों: उदाहरण के लिए

#in your model 
class Project < ActiveRecord::Base 
    scope :having_more_than_x_workers, lambda do |workers_count| 
    joins(:workers).select('projects.*').group('projects.id').having("COUNT(workers.*) > #{workers_count || 0}") 
    end 

end 

इसके इस्तेमाल के लिये अपने नियंत्रक में (जैसे where) डेटाबेस क्वेरी बनाकर काम करते हैं; दूसरे शब्दों में, आप where में एक विशेषता उपयोग नहीं कर सकते जब तक कि यह वास्तव में आपके डेटा मॉडल पर मौजूद है। अन्यथा, डेटाबेस इसके बारे में नहीं जानता है और आपके लिए फ़िल्टरिंग नहीं कर सकता है।

आपके मामले में, आपको Project कक्षा पर एक विधि परिभाषित करनी चाहिए जो "उपलब्ध है?" क्वेरी, ताकि आप where के स्थान पर अपनी विधि का उपयोग कर सकें। आप इसे इस तरह कर सकते हैं:

class Project < ActiveRecord::Base 
    def self.available_projects 
    where('workers_count > 2') 
    end 
end 

कैसे क्वेरी या कैसे एक नामित गुंजाइश के रूप में यह परिभाषित करने के लिए लिखने के बारे में विशिष्ट जानकारी के लिए MrYoshiji's answer देखें।

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