2011-09-06 16 views
16

Bir modüle paylaşılan kapsamları taşıyarak çeşitli modeller kurur istiyorum gibi bir şey:Modül üzerinden paylaşılan kapsamlar?

module CommonScopes 
    extend ActiveSupport::Concern 

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

Ben de modülü test paylaşılan özelliklerini oluşturmak istiyorum. Ne yazık ki, modelimdeki paylaşılan kapsamı dahil etmeye çalıştığımda, şunu elde ederim:

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

Herhangi bir fikrin var mı? Teşekkürler!

cevap

13

sen raylar gibi 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

Şimdi lambdas tercih edilmeli midir? – mdemolin

+0

@mdemolin Ben bir lambda olmadan 'kapsamı 'çağırmak inanıyorum diyelim ki raylar 4. – Gazler

+1

tam olarak ne söylüyordum :) (ama ben şimdilik şimdilik tercih edilen sözdizimi olduğunu düşünüyorum ve henüz kullanımdan kaldırılmamış) – mdemolin

2
sizin modül Ruby tarafından ayrıştırılır ve bu sizin CommonScopes modülünden erişilebilir değil, bir kullanıcının scope yöntem hemen denir Çünkü

..

Ama eğer bir sınıf yöntemi ile sizin kapsam çağrıyı değiştirebilirsiniz:

module CommonScopes 
    extend ActiveSupport::Concern 

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

kullanabilirsiniz 4 scope syntax sadece kullanabileceğiniz bir lambda kodun yürütülmesini geciktirmek için (raylar 3'te de çalışır):

module CommonScopes 
    extend ActiveSupport::Concern 

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

Bu daha iyi bir yoldur. –

İlgili konular