2012-12-27 12 views
9

Mi piacerebbe generare gli ambiti dinamicamente. Diciamo che ho il seguente modello:Generazione dinamica di ambiti nei modelli di rotaie

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 

Possiamo sostituire i scope chiamate con qualcosa in base alle POSSIBLE_SIZES costante? Penso che stia violando DRY per ripeterli.

risposta

27

si potrebbe fare

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

ma io personalmente preferisco:

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

Molto ordinato, grazie! (e sì, so degli ambiti con argomenti. Penso che questo sia più pulito nel mio caso specifico) – spike

2

si può fare un ciclo

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