有没有办法检查模型中的任何命名空间?
即这就是我要找的东西
Foo::Bar.modulized? = true
Bar.modulized? = false
检查是否针对特定模块的任何命名空间
答案 0 :(得分: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
希望有所帮助!
答案 1 :(得分:0)
我这样做:
ActiveRecord::Base.name.include?('ActiveRecord::') # => true
要检查模型是否使用任何模块进行模块化,只需执行以下操作:
ActiveRecord::Base.name.include?('::')
但是,请注意它会为内部类返回true:
class Main
class Inner
end
end
clazz = Main::Inner
clazz.name.include?('::')
希望它有所帮助!
答案 2 :(得分:0)
我认为没有这样的方法,但您可以使用Module :: nesting来实现它,例如,如果你有一个嵌套类:
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"