2012-12-27 21 views
9

Chciałbym generować zakresy dynamicznie. Powiedzmy, że mam następujący model:Dynamicznie generuj zakresy w modelach szyn

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 

możemy zastąpić te scope połączenia z czymś w oparciu o POSSIBLE_SIZES stałych? Myślę, że naruszam DRY, aby je powtórzyć.

Odpowiedz

27

można zrobić

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

ale ja osobiście wolę:

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

Bardzo schludny, dzięki! (i tak, wiem o zakresach z argumentami. Myślę, że w moim przypadku jest to czystsze) – spike

2

można zrobić pętlę

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