有没有什么好的方法来干扰范围/谓词逻辑重复?

时间:2012-02-01 22:43:38

标签: ruby-on-rails ruby-on-rails-3 activerecord scope dry

例如,请考虑以下代码(在模型中):

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,第二个条件是ruby,但仍然存在明显的重复。干嘛有什么好方法吗?这种情况的最佳做法是什么?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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