I'd like to generate scopes dynamically. Let's say I have the following model:
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
Can we replace the scope
calls with something based on the POSSIBLE_SIZES constant? I think I'm violating DRY to repeat them.
you could do
class Product < ActiveRecord::Base
[:small, :medium, :large].each do |s|
scope s, where(size: s)
end
end
but I personally prefer:
class Product < ActiveRecord::Base
scope :sized, lambda{|size| where(size: size)}
end
you can do a loop
class Product < ActiveRecord::Base
POSSIBLE_SIZES = [:small, :medium, :large]
POSSIBLE_SIZES.each do |size|
scope size, where(size: size)
end
end
For rails 4+, just updating @bcd 's answer
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
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.