Ruby on rails 3 将Rails 3作用域合并到类方法中

Ruby on rails 3 将Rails 3作用域合并到类方法中,ruby-on-rails-3,scope,Ruby On Rails 3,Scope,我有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 +

我有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)
  }
范围:年龄0,λ{
其中(“可用时间为空或可用时间<?”,日期:今天+30天)
}
经营范围:lambda,30岁{
其中(“可用时间>=”和可用时间<”,Date.today+30.days,Date.today+60.days)
}
经营范围:lambda,60岁{
其中(“可用时间>=”和可用时间<”,Date.today+60.days,Date.today+90.days)
}
经营范围:lambda,90岁{
其中(“可用时间>=?”,Date.day+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
def自老化(天)
联接(:profile)。其中(“available_at为空或available_at<?”,Date.day+30.days),如果days==0
连接(:profile)。其中(“在>=?处可用,在<?”处可用”,Date.today+30.days,Date.today+60.days),如果天==30
联接(:profile)。其中(“可用时间>=”和可用时间<?”,Date.today+60.days,Date.today+90.days)如果天==60
连接(:profile).where(“在>=?”可用,Date.today+90.days)如果天==90
结束
但我不知道返回什么来确保它与Rails3作用域兼容

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

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

是否将参数传递给lambda

scope :available_range, lambda { |start|
    where("available_at >= ? AND available_at < ?", start, end+30.days)
}
范围:可用范围,lambda{124;开始|
其中(“可用时间>=”和可用时间<?”,开始、结束+30天)
}

另外,请参见此处的“动态范围构造”:我需要一个“默认”操作。我添加了'joins(:profile')。也许有更好的方法,但这是有效的

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
def自老化(天)
联接(:profile)。其中(“available_at为空或available_at<?”,Date.day+30.days),如果days==0
连接(:profile)。其中(“在>=?处可用,在<?”处可用”,Date.today+30.days,Date.today+60.days),如果天==30
联接(:profile)。其中(“可用时间>=”和可用时间<?”,Date.today+60.days,Date.today+90.days)如果天==60
连接(:profile).where(“在>=?”可用,Date.today+90.days)如果天==90
联接(:纵断面)
结束

好主意。目标是什么?自我老化会带来什么?某种过滤器。连接(:profile).where(“可在>?”,Date.day+90.days)