2015-07-10 70 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"