2012-02-01 12 views
9

उदाहरण के लिए, निम्नलिखित कोड (एक मॉडल में) पर विचार करें:क्या ड्रॉ अप करने के लिए कोई अच्छा तरीका है/तर्क तर्क डुप्लिकेट?

scope :popular, where("views >= 250 OR (views >= 10 AND avg_rating >= 4.75)") 

def popular? 
    views >= 250 or views >= 10 && avg_rating >= 4.75 
end 

पहली शर्त एसक्यूएल है, दूसरा एक गहरे लाल रंग का है, लेकिन अभी भी, वहाँ एक स्पष्ट दोहराव है। क्या इसे सूखने का कोई अच्छा तरीका है? ऐसे मामलों के लिए सबसे अच्छा अभ्यास क्या है?

उत्तर

2

अच्छे कारणों के लिए दोनों तो मैं (सभी मॉडल में) इस पर विचार हो सकता हैं:

VIEWS_QUALIFIER = 250 
RATING_VIEWS_QUALIFIER = 10 
RATING_QUALIFIER = 4.75 

scope :popular, where("views >= ? OR (views >= ? AND avg_rating >= ? ", 
       VIEWS_QUALIFIER, RATING_VIEWS_QUALIFIER, RATING_QUALIFIER) 

def popular? 
    views >= VIEWS_QUALIFIER or 
    (views >= RATING_VIEWS_QUALIFIER && avg_rating >= RATING_QUALIFIER) 
end 
+0

ऐसा लगता है कि गुंजाइश परिभाषा ... – Alexis

+0

हाँ लिखने में कोई गलती है की तरह। मैंने इसे सही किया। –

0
def popular? 
    !!self.class.popular.includes? self 
end 
+0

उपरोक्त के खिलाफ सलाह देंगे क्योंकि यह एक आइटम लोकप्रिय होने के लिए बस सभी लोकप्रिय रिकॉर्ड लोड करेगा। हो सकता है कि 'self.class.popular.exists? (Id)' –

+2

@ थोंगकुआह काम कर सकता है, सभी समान समाधानों के साथ एक और समस्या भी है - जब विधि 'गंदे' और 'विचार' या 'avg_rating में हो तो विधि संभवतः गलत परिणाम लौटा सकती है 'बदला गया है लेकिन सहेजा नहीं गया – Alexis

+1

एसओ में सीखने के लिए हमेशा एक जगह होती है। टिप्पणियों के लिए टीवाई! :) – fuzzyalej

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

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