2011-09-06 75 views
16

我想通過移動共享範圍到一個模塊中乾涸的幾款機型,這樣的:通過模塊共享示波器?

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 

任何想法?謝謝!

回答

13

可以在軌使用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 
+0

難道你不認爲lambda應該是首選嗎? – mdemolin

+0

@mdemolin我相信在沒有lambda的情況下調用'scope'在rails 4中已被棄用了。 – Gazler

+1

正是我所說的:)(但我認爲它只是現在的首選語法,而不是棄用) – mdemolin

2

因爲當你的模塊是由紅寶石解析,它不是從你的CommonScopes模塊可訪問您的scope方法是直接調用..

,但可以更換的一類方法的範圍內調用:

module CommonScopes 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def ordered_for_display 
     order("#{self.to_s.tableize}.rank asc") 
    end 
    end 
end 
37

由於4 scope syntax,你可以簡單地使用lambda延遲代碼的執行(在rails 3中也有效):

module CommonScopes 
    extend ActiveSupport::Concern 

    included do 
    scope :ordered_for_display, -> { order("#{self.to_s.tableize}.rank asc") } 
    end 
end 
+0

這是更好的方法。 –