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):
module CommonScopes
  extend ActiveSupport::Concern
  included do
    scope :ordered_for_display, -> { order("#{self.to_s.tableize}.rank asc") }
  end
end
                        You can use instance_eval
module CommonScopes
  extend ActiveSupport::Concern
  def self.included(klass)
    klass.instance_eval do
      scope :ordered_for_display, order("#{self.to_s.tableize}.rank asc")
    end
  end
end
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With