2011-11-11 9 views
7

मैं एक साथ कई समेकित कार्य करना चाहता हूं, उदाहरण के लिए अधिकतम और न्यूनतम आईडी को समूह द्वारा समूहित करने के लिए:Rails/ActiveRecord में एक साथ कई समेकित कार्यों का उपयोग कैसे करें?

Model.maximum(:id).minimum(:id).group(:status) 

यह काम नहीं करता है (कम से कम रेल 3.1.1 के साथ) - आपको न्यूनतम पर कोई त्रुटि मिलती है कॉल करें, यह कहें कि यह फिक्सनम पर परिभाषित नहीं है।

NoMethodError: undefined method `minimum' for 22377:Fixnum 

मैं इसके लिए कच्चे एसक्यूएल कर सकता हूं - लेकिन बस सोच रहा हूं कि उच्च स्तर/रेल विकल्प है या नहीं ...

धन्यवाद, क्रिस

उत्तर

13

मेरा मानना ​​है कि @topek सही है कि इस तरह श्रृंखला नहीं आप कर सकते हैं गणना के कार्य करता है। मुझे लगता है कि आप एक select विधेय में एसक्यूएल का उपयोग करना होगा, उदा .:

Model.select('MAX(id) AS `maximum`, MIN(id) AS `minimum`').group(:status) 

मैं सिर्फ अपनी खुद की एक परियोजना में इस परीक्षण किया है और यह अपेक्षा के अनुरूप काम करने के लिए प्रकट होता है।

+1

यह मेरे लिए बेहतर दिखता है - अच्छा। –

3

मुझे नहीं लगता कि इस के साथ संभव है ये कुल कार्य, क्योंकि वे एक मान वापस करते हैं और दायरे नहीं, docs देखें। वे सभी कैलकुलेट प्रणाली है, जो उपयोग के रूप में आप किसी संख्या देख सकते हैं:

 # File lib/active_record/calculations.rb, line 117 
117:  def calculate(operation, column_name, options = {}) 
118:   validate_calculation_options(operation, options) 
119:   column_name  = options[:select] if options[:select] 
120:   column_name  = '*' if column_name == :all 
121:   column   = column_for column_name 
122:   catch :invalid_query do 
123:   if options[:group] 
124:    return execute_grouped_calculation(operation, column_name, column, options) 
125:   else 
126:    return execute_simple_calculation(operation, column_name, column, options) 
127:   end 
128:   end 
129:   0 
130:  end 

आप ऐसा करना चाहते हैं, तो आप हाथ से क्वेरी शिल्प के लिए की है।

यहाँ एक उदाहरण है:

sql = "SELECT max(id) as max_id, 
       min(id) as min_id 
     FROM model 
     GROUP 
      BY status 
    " 
Model.find_by_sql(sql).each do |row| 
    puts "min. id: #{row.min_id}, " << 
     "max. id: #{row.max_id}, " 
end 
+0

Ok- अच्छा लग रहा है, उसके लिए धन्यवाद। –

12

मेरे पास एक समान समस्या है जिसे मैंने रेल 4 में प्लक के साथ समूह का उपयोग करके हल किया है।

Model.group(:status).pluck('min(id)','max(id)') 

भी, ऑर्डर आदि और गणना कॉलम के साथ काम करता है।

Model.group('CAST(created_at AS Date), EXTRACT(HOUR FROM created_at), floor(EXTRACT(MINUTE FROM created_at)/15) * 15') 
    .having('count(id) > 10') 
    .order('min(created_at)') 
    .pluck('count(id)') 

चीयर्स

+0

धन्यवाद, यह बहुत अच्छा काम करता है। – jayant

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

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