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测试似乎没有像我期望的那样工作.
将参数传递给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的