2012-02-01 41 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 

首要條件是SQL,第二個是紅寶石,不過,有一個明顯的重複。有沒有什麼好的方法來幹掉它?這種情況的最佳做法是什麼?

回答

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 2012-02-02 09:39:15

+0

是一個錯字。我糾正了它。 – 2012-02-02 13:42:17

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

會建議以上,因爲這將加載所有流行的記錄只是爲了檢查一個項目是受歡迎的。也許'self.class.popular.exists?(id)'可能會工作 – 2012-02-02 12:31:10

+2

@ThongKuah所有類似的解決方案也存在另一個問題 - 當對象處於「髒」和「視圖」或「平均值」時,該方法可能會返回錯誤的結果'改變了但沒有保存 – Alexis 2012-02-02 15:04:22

+1

在SO中總是有學習的地方。 TY的評論! :) – fuzzyalej 2012-02-02 17:40:38

相關問題