2011-09-05 14 views
6

द्वारा उप-संग्रह में परिणाम देता है मैं रेल 3.1 में एक ActiveRecord क्वेरी करने का प्रयास कर रहा हूं, जहां मैं परिणामों को समूहबद्ध वस्तुओं के उप-संग्रह में सॉर्ट करता हूं, इस मामले में समूह द्वारा तिथिबद्ध।रेल सक्रिय एक्टिव रिकॉर्ड समूह

मुझे लगता है कि मेरा कोड इसे सर्वोत्तम समझा सकता है। यह मेरी विधि है, जो काम करती है लेकिन नौकरी पाने के लिए 4 प्रश्न जारी करती है। यह इस तरह से करने के लिए बहुत प्रभावी प्रतीत नहीं होता है।

def entry_days 
    days = @user.entry_groups.find(
    :all, 
    :select => 'date', 
    :limit => 3, 
    :group => 'date').map(&:date) 

    entry_days = days.map do |date| 
    { :date => date, 
     :entry_groups => @user.entry_groups.find_all_by_date(date) 
    } 
    end  
end 

group_by उपयोग करने के लिए नीचे दिए गए डेव न्यूटन से सुझाव का उपयोग करना, मैं विधि इस तरह फिर से लिखा है:

def entry_days 
    dates_with_entries = @user.entry_groups.find(
    :all, 
    :select => 'date', 
    :limit => 3, 
    :group => 'date').map(&:date) 

    @user.entry_groups.where(:date => dates_with_entries).all.group_by(&:date). 
    map do |date, entry_groups| 
     { :date => date, 
     :entry_groups => entry_groups } 
    end 
end 

कम से कम मैं इसे नीचे केवल 2 प्रश्नों का अब है।

तब मैं फिर से पुनः लिखा विधि इस तरह:

dates_with_entries = user.entry_groups.all(
     :select => 'date', 
     :limit => num_days, 
     :order => 'date DESC', 
     :group => 'date').map(&:date) 

    entry_groups = user.entry_groups. 
     where(
     :date => dates_with_entries 
    ). 
     all(:order => 'date DESC') 

    entry_days = entry_days.group_by(&:date). 
     map { |date, entry_groups| 
     { 
      :date => date, 
      :entry_groups => entry_groups 
     } 
     } 

एक तरफ ध्यान दें पर: मैं इतने सारे तरीकों को एक साथ चेनिंग नहीं होना चाहिए, और नेस्टेड तरीकों और हैश के लिए पसंदीदा खरोज प्रारूप क्या है?

+0

यह प्रश्न: http://stackoverflow.com/questions/6953512/rails-3-1-with-postgresql-group-by-must-be-used-in-an-aggregate-function/6953704#6953704, कुछ समान – rubish

उत्तर

6

क्यों उन सभी का चयन नहीं करें तो group_by जैसे कुछ का उपयोग करें?

+1

पर चर्चा करता है आखिरकार इस संग्रह का समर्थन हजारों पंक्तियों से किया जाएगा और मुझे केवल 3 दिनों की प्रविष्टियों के लायक चाहिए, और उन दिनों में कम-से-कम 1 प्रविष्टि होनी चाहिए। अगर मुझे गलत नहीं लगता है, तो आपका सुझाव क्वेरी के लिए सभी पंक्तियों को खींचना है। मैं ऐसा कर सकता था लेकिन मैं वर्णित व्यवहार को रखना चाहता हूं। –

+0

मुझे लगता है कि मैं अपना दूसरा चयन करने के बाद, group_by विधि का उपयोग करके प्रविष्टियों के दिनों की मैपिंग कर सकता हूं। इससे क्वेरी कुल 2 तक पहुंच जाएगी। –

+0

यदि प्रति दिन कम से कम एक प्रविष्टि हमेशा रहेगी, ऐसा लगता है कि आप बस एक तिथि सीमा और समूह को पुनर्प्राप्त करने के आधार पर चुन सकते हैं। –

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