I want to dry up several models by moving shared scopes into a module, something like:
module CommonScopes
extend ActiveSupport::Concern
module ClassMethods
scope :ordered_for_display, order("#{self.to_s.tableize}.rank asc")
end
end
I also want to create shared specs that test the module. Unfortunately when I try to include the shared scope in my model I get:
undefined method `order' for CommonScopes::ClassMethods:Module
Any ideas? Thanks!
As in rails 4 scope syntax you can simply use a lambda to delay the execution of the code (works in rails 3 too):
You can use instance_eval
Because your
scope
method is called immediately when your module is parsed by Ruby and it's not accessible from yourCommonScopes
module..But you can replace your scope call by a class method: