2010-11-15 53 views
3

我有4個Rails 3個的範圍,我想簡化:結合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範圍兼容。

這是一個很好的方法嗎?有一個更好的方法嗎?

**編輯** 我更新了方法的邏輯。如果測試似乎沒有像我期望的那樣工作。

+0

很酷的想法。目標是什麼?什麼self.aging返回? – gmoore 2010-11-15 15:10:04

+0

某種過濾器。加入(:profile).where(「available_at>?」,Date.today + 90.days) – craig 2010-11-15 17:06:11

回答

3

我需要一個 '默認' 的行動。我添加了「連接(:配置文件)」。也許有更好的辦法,但這有效。

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