Объедините область Rails 3 в метод класса - PullRequest
3 голосов
/ 15 ноября 2010

У меня есть 4 Rails 3 области, которые я хотел бы упростить:

  scope :age_0, lambda {
    where("available_at IS NULL OR available_at < ?", Date.today + 30.days)
  }
  scope :age_30, lambda {
    where("available_at >= ? AND available_at < ?", Date.today + 30.days, Date.today + 60.days)
  }
  scope :age_60, lambda {
    where("available_at >= ? AND available_at < ?", Date.today + 60.days, Date.today + 90.days)
  }
  scope :age_90, lambda {
    where("available_at >= ?", Date.today + 90.days)
  }

Я думал о методе класса:

def self.aging(days)

  joins(:profile).where("available_at IS NULL OR available_at < ?", Date.today + 30.days) if days==0
  joins(:profile).where("available_at >= ? AND available_at < ?", Date.today + 30.days, Date.today + 60.days) if days==30
  joins(:profile).where("available_at >= ? AND available_at < ?", Date.today + 60.days, Date.today + 90.days) if days==60
  joins(:profile).where("available_at >= ?", Date.today + 90.days) if days==90

end

Но я не знаю, что вернутьчтобы убедиться, что он будет совместим с областями Rails 3.

Это хороший подход?Есть ли лучший способ сделать это?

** edit ** Я обновил логику метода.Тест if не работает так, как я ожидаю.

Ответы [ 2 ]

6 голосов
/ 15 ноября 2010

Передать аргумент лямбда-выражению?

scope :available_range, lambda { |start|
    where("available_at >= ? AND available_at < ?", start, end+30.days)
}

Также см. «Построение динамической области» здесь: http://archives.edgerails.info/articles/what-s-new-in-edge-rails/2010/02/23/the-skinny-on-scopes-formerly-named-scope/index.html

3 голосов
/ 17 ноября 2010

Мне нужно действие по умолчанию. Я добавил 'joins (: профиль)'. Возможно, есть лучший способ, но это сработало.

def self.aging(days)

  joins(:profile).where("available_at IS NULL OR available_at < ?", Date.today + 30.days) if days==0
  joins(:profile).where("available_at >= ? AND available_at < ?", Date.today + 30.days, Date.today + 60.days) if days==30
  joins(:profile).where("available_at >= ? AND available_at < ?", Date.today + 60.days, Date.today + 90.days) if days==60
  joins(:profile).where("available_at >= ?", Date.today + 90.days) if days==90
  joins(:profile)

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