2010-11-15 16 views
3

J'ai 4 Rails 3 scopes que je voudrais simplifier:Combiner Rails 3 Champ d'application en méthode de classe

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) 
    } 

Je pensais à une méthode de classe:

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 

Mais je ne sais pas ce qu'il faut retourner pour s'assurer qu'il sera compatible avec les portées Rails 3.

Est-ce une bonne approche? Y a-t-il une meilleure manière de faire cela?

** modifier ** J'ai mis à jour la logique de la méthode. Le test if ne semble pas fonctionner comme prévu.

+0

Idée cool. Quel est le but? Que retournerait-il? – gmoore

+0

une sorte de filtre. joint (: profile) .where ("available_at>?", Date.today + 90.days) – craig

Répondre

3

J'ai besoin d'une action 'par défaut'. J'ai ajouté 'joins (: profile)'. Il y a peut-être un meilleur moyen, mais cela a fonctionné.

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