2012-12-27 3 views
9

Je souhaite générer dynamiquement des étendues. Disons que j'ai le modèle suivant:Générer dynamiquement des étendues dans des modèles de rails

class Product < ActiveRecord::Base 
    POSSIBLE_SIZES = [:small, :medium, :large] 
    scope :small, where(size: :small) 
    scope :medium, where(size: :medium) 
    scope :large, where(size: :large) 
end 

Peut-on remplacer les appels scope avec quelque chose sur la base des constantes POSSIBLE_SIZES? Je pense que je viole DRY pour les répéter.

Répondre

27

vous pourriez faire

class Product < ActiveRecord::Base 
    [:small, :medium, :large].each do |s| 
    scope s, where(size: s) 
    end 
end 

mais je préfère personnellement:

class Product < ActiveRecord::Base 
    scope :sized, lambda{|size| where(size: size)} 
end 
+1

Très soigné, merci! (et oui, je connais les étendues avec des arguments, je pense que c'est plus propre dans mon cas particulier) – spike

2

vous pouvez faire une boucle

class Product < ActiveRecord::Base 
    POSSIBLE_SIZES = [:small, :medium, :large] 
    POSSIBLE_SIZES.each do |size| 
     scope size, where(size: size) 
    end 
end 
Questions connexes