2015-07-10 69 views

回答

1

你可以試試這個

Foo::Bar.ancestors.select {|o| o.class == Module }.include?(Foo) 

Foo::Bar.included_modules.include?(Foo) 

要檢查該機型擁有的任何命名空間或沒有,你可以做到這一點

Foo::Bar.parent == Foo #=> true 

或者乾脆

Foo::Bar.parent.is_a? Module #=> true 

希望幫助!

+0

HM,對我來說'MyMod :: MyClass.ancestors.select {| Ø| o.class == Module} .include?(MyMod)#=> false' –

+0

非常感謝RSB,但我應該更具體。我正在查看模型是否有任何名稱空間不是特定的名稱空間。 –

+0

我編輯了答案 – RSB

0

我應該這樣做:

ActiveRecord::Base.name.include?('ActiveRecord::') # => true 

要檢查是否模型與任何模塊模組化,只是做:

ActiveRecord::Base.name.include?('::') 

但是,要知道,它會爲內部類返回true :

class Main 
    class Inner 
    end 
end 

clazz = Main::Inner 
clazz.name.include?('::') 

希望它有幫助!

+1

我需要檢查任何模塊不只是一個特定的。但是,這給了我一個想法,這將工作'ActiveRecord :: Base.name。包括(「::」)#=>真'我想不出它會導致任何問題? –

0

我覺得沒有這樣的方法,但你可以使用模塊::嵌套來實現它,比如,如果你有一個嵌套類:

module A 
    class B 
    puts Module.nesting.inspect 
    end 
end 

前面代碼的輸出是:[A::B, B]

如果你的類沒有嵌套:

class C 
    puts Module.nesting.inspect 
end 

輸出將是:[C]

那麼,你可以創建一個模塊與模塊?類方法:

- 在lib目錄中創建一個名爲active_record_extension.rb的文件。

module ActiveRecordExtension 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def modulized? 
     Module.nesting.size > 1 
    end 
    end 
end 

ActiveRecord::Base.send(:include, ActiveRecordExtension) 

創建在config/initializers目錄名爲extensions.rb中一個文件,下面的行添加到文件:

require "active_record_extension"