используя если с областью на модели - PullRequest
4 голосов
/ 29 сентября 2011

Я пытаюсь создать именованную область действия с именем current_season, где он будет правильно идентифицировать записи, связанные с годом, в котором мы находимся. В основном достаточно просто, за исключением того, что я хочу, чтобы все в июне и позже использовали текущий год и все до июняиспользовать предыдущий год.

в рельсах 3.1 Я легко могу использовать:

scope :current_season, lambda { where('season = ?',Time.now.year) } if Time.now.month >= 6

, чтобы получить возможность работать только в том случае, если мы находимся в конце года и:

scope :current_season, lambda { where('season = ?',Time.now.year - 1) } if Time.now.month < 6

Но, кажется, расточительно называть все это дважды и не использовать вещи типа if / else или иметь возможность вызывать что-то, что я определил ниже, чтобы показать точный год, такой как:

scope :current_season, lambda { where('season = ?',:current_season_year) } 

def current_season_year
  if Time.now.month >= 6
    Time.now.year
  else
    Time.now.year - 1
  end
end

Но это просто смеется надо мной, когда я пытаюсь это сделать.Есть ли более чистый способ?У меня также будут область видимости: last_season и scope: previous_season, скорее всего, и они будут следовать схожей логике.

Заранее спасибо за любой совет!

1 Ответ

13 голосов
/ 29 сентября 2011

Именованные области являются просто DSL для написания методов класса, которые имеют одинаковую функциональность. Когда вы обнаружите, что они ограничивают вас, просто переключитесь на метод класса:

def self.current_season
  year = Time.now.month >= 6 ? Time.now.year : Time.now.year - 1
  where('season = ?', year)
end

Конечно, вы также можете включить это в область видимости:

scope :current_season, do
  # same code as above...
end

Это просто определит его как метод класса в модели. Компромисс - это ясность в намерении области (ожидается, что она возвратит цепочечный ActiveRecord::Relation) по сравнению с ясностью в документации (если вы запускаете что-то вроде RDoc, он не будет замечать метод, доступный в Model.current_season, потому что он не ' в коде еще не определено).

Обновление:

Существует одно дополнительное преимущество использования области вместо метода класса:

User.admin.create name: 'Corey'  #=> <User: @name="Corey" @admin=true>

Вы также можете использовать область для создания объекта с определенными параметрами. В этом случае это не очень полезно, но стоит подумать, решая, какой использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...