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

相关问题