【问题标题】:When are modules included in a Ruby class running in rails?什么时候在 Rails 中运行的 Ruby 类中包含模块?
【发布时间】:2011-04-01 10:39:37
【问题描述】:

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

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 控制台或运行服务器后立即调用此方法,则返回 []。但是,如果我首先实例化其中一个使用模型的实例,它将在结果中返回该模型。

那么模块什么时候被包含在内?我猜这个过程比他的应用程序启动时晚。如果我不能在这个过程的早期以这种方式获得这些信息,有没有办法做到这一点?

【问题讨论】:

  • 我认为它会在调用包含模块的模型时被加载。

标签: ruby metaprogramming dynamic-languages


【解决方案1】:

在定义类时执行包含语句时会包含它们。当你第一次使用它们时,Rails 会自动加载模块/类。另外,你可以试试这样的:

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

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

【讨论】:

  • 不幸的是,“Rails 会在您第一次使用它们时自动加载模块/类”意味着我可能无法完成我想做的工作,但这并没有降低答案的正确性。谢谢。
  • 不应该是@@rateable_object 而不是@rateable_objects 吗?
猜你喜欢
  • 1970-01-01
  • 2012-08-14
  • 2011-04-20
  • 2015-02-10
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
相关资源
最近更新 更多