26

次のように、共有スコープをモジュールに移動して、いくつかのモデルを DRY したいと考えています。

module CommonScopes
  extend ActiveSupport::Concern

  module ClassMethods
    scope :ordered_for_display, order("#{self.to_s.tableize}.rank asc")
  end
end

また、モジュールをテストする共有仕様も作成したいと考えています。残念ながら、モデルに共有スコープを含めようとすると、次のようになります。

undefined method `order' for CommonScopes::ClassMethods:Module

何か案は?ありがとう!

4

3 に答える 3

65

Rails 4 のスコープ構文と同様に、ラムダを使用してコードの実行を遅らせることができます (Rails 3 でも機能します)。

module CommonScopes
  extend ActiveSupport::Concern

  included do
    scope :ordered_for_display, -> { order("#{self.to_s.tableize}.rank asc") }
  end
end
于 2013-11-26T14:03:57.070 に答える
17

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
于 2011-09-06T17:54:31.703 に答える
2

scopeモジュールがRubyによって解析されるとすぐにメソッドが呼び出され、モジュールからアクセスできないためCommonScopes..

ただし、スコープ呼び出しをクラス メソッドで置き換えることができます。

module CommonScopes
  extend ActiveSupport::Concern

  module ClassMethods
    def ordered_for_display
      order("#{self.to_s.tableize}.rank asc")
     end
  end
end
于 2011-09-06T17:48:30.630 に答える