什么时候模块包含在运行在rails中的Ruby类中?

时间:2010-08-20 00:51:54

标签: ruby metaprogramming dynamic-languages

我正在尝试编写一个方法,告诉我包含特定模块的每个类。它看起来像这样 -

def Rating.rateable_objects
  rateable_objects = []
  ObjectSpace.each_object(Class) do |c|
    next unless c.include? Rateable
    rateable_objects << c
  end
  rateable_objects
end

“Rateable”是我的模块,我将其包含在几个模型中。

我发现如果我在启动rails console或运行服务器之后立即调用它,则此方法返回[]。但是,如果我首先实例化其中一个消费模型的实例,它将在结果中返回该模型。

那么什么时候包含模块?我猜这个过程的后期比他应用启动的时候要多。如果我不能在这个过程的早期以这种方式获得这些信息,那么无论如何都要实现这个目标吗?

1 个答案:

答案 0 :(得分:4)

在定义类时执行include语句时包含它们。 Rails首次使用时会自动加载模块/类。此外,您可以尝试这样的事情:

module Rateable
  @rateable_object = []
  def self.included(klass)
    @rateable_objects << klass
  end
  def rateable_objects
    @rateable_objects
  end
end

这将构建列表,因为类包含模块。