Есть ли хороший способ высушить дублирование логики области действия / предиката? - PullRequest
10 голосов
/ 02 февраля 2012

Например, рассмотрим следующий код (в модели):

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 ]

2 голосов
/ 02 февраля 2012

Есть веские причины иметь оба варианта, поэтому я мог бы рассмотреть это (все в модели):

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 голосов
/ 02 февраля 2012
def popular?
  !!self.class.popular.includes? self
end
...