Rails - 检查模型是否已模块化

时间:2015-07-10 13:41:40

标签: ruby-on-rails ruby activerecord

有没有办法检查模型中的任何命名空间?

即这就是我要找的东西

Foo::Bar.modulized? = true
Bar.modulized? = false

检查是否针对特定模块的任何命名空间

3 个答案:

答案 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"