将Rails 3范围合并到类方法中

cra*_*aig 3 scope ruby-on-rails-3

我有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)
  }
Run Code Online (Sandbox Code Playgroud)

我想过一个类方法:

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
Run Code Online (Sandbox Code Playgroud)

但我不知道要返回什么以确保它与Rails 3范围兼容.

这是一个好方法吗?有一个更好的方法吗?

**编辑**我更新了方法的逻辑.if测试似乎没有像我期望的那样工作.

gmo*_*ore 6

将参数传递给lambda?

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

此外,请参阅此处的"动态范围构建":http://archives.edgerails.info/articles/what-s-new-in-edge-rails/2010/02/23/the-skinny-on-scopes-formerly-命名范围/ index.html的