Динамически генерировать области в моделях рельсов

Я хотел бы генерировать области динамически. Допустим, у меня есть следующая модель:

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

Можем ли мы заменить вызовы scope чем-то, основанным на константе POSSIBLE_SIZES? Я думаю, что нарушаю DRY, чтобы повторять их.


person spike    schedule 27.12.2012    source источник


Ответы (3)


ты мог бы сделать

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

но я лично предпочитаю:

class Product < ActiveRecord::Base
  scope :sized, lambda{|size| where(size: size)}
end
person Cristian Bica    schedule 27.12.2012

ты можешь сделать петлю

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

Для rails 4+ просто обновите ответ @bcd

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

or

class Product < ActiveRecord::Base
  scope :sized, ->(size) { where(size: size) }
end
person strivedi183    schedule 08.09.2018