2011-08-19 23 views
6

तो, मेरे पास Photo मॉडल है जिसे full_size और presentation_size पर डाउनलोड किया जा सकता है। जब कोई उपयोगकर्ता एक फोटो डाउनलोड करता है तो मैं इसे फोटो के full_downloads और presentation_downloads विशेषता पर ट्रैक करता हूं।रेल: दो कॉलम के योग द्वारा आदेश

यह सब अच्छा है।

कभी-कभी मैं जानना चाहता हूं कि कितने कुल डाउनलोड हुए हैं।

def total_downloads 
    self.full_downloads + self.presentation_downloads 
end 

मेरा प्रश्न है: मैं इन (पूर्ण, प्रस्तुति, कुल डाउनलोड) के सभी तीन से फ़ोटो ऑर्डर करने के लिए सक्षम होने के लिए चाहते हैं मैं एक सरल विधि, total_downloads जो इतनी तरह दिखता है। पहले दो आसान हैं, लेकिन आप दो कॉलम के योग से ऑर्डर कैसे करते हैं? ध्यान दें कि इसे कम से कम SQLite और PG दोनों संगत होने की आवश्यकता है।

एक साइड सवाल, total_downloads विधि को एक प्रश्न बनाने के लिए तेज़ होगा, और यदि ऐसा है तो इसे लिखने का सबसे अच्छा तरीका क्या है? मुझे उस कक्षा पर योग करना है जिसे आप Photo.sum(...) पर कॉल कर सकते हैं, लेकिन मुझे यकीन नहीं है कि एक रिकॉर्ड पर दो कॉलम के लिए इसे कैसे किया जाए।

धन्यवाद!

+0

क्या आप सीधे एसक्यूएल लिखने के साथ ठीक होंगे या यह एक मुद्दा होगा? –

+0

@ डेविन एम - मैं करूँगा जो मुझे करना होगा :) – Andrew

उत्तर

16

आप इस कोशिश कर सकते हैं:

Photo.order('full_downloads + presentation_downloads') 

यह इस SQL ​​क्वेरी चलेंगे:

SELECT "photos".* FROM "photos" ORDER BY full_downloads + presentation_downloads 

यह हालांकि संभावित धीमी है। यदि आपके पास एक बड़ा डेटासेट है और अक्सर इस तरह के ऑर्डर का उपयोग करते हैं, तो आपको total_downloads कॉलम बनाने पर विचार करना चाहिए और रिकॉर्ड का full_downloads या presentation_downloads कॉलम परिवर्तनों को फिर से गणना करना चाहिए।

+4

+1 संभावित रूप से धीमा, लेकिन अभी भी रूबी की तुलना में निश्चित रूप से तेज़ है। –

+0

@ किर्क: हाँ, यह सही है :) – htanata

+0

अच्छा लगता है। धन्यवाद! – Andrew

3

Photo.order('full_downloads + presentation_downloads DESC')

यह निश्चित रूप से रूबी में तरह की तुलना में बहुत तेजी से किया जाएगा।

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