在嵌套模型中包含模块方法 Class

Include Module Method in Nested Model Class

在我的代码库的几个地方,我有一个硬编码的整数,我必须将它放入一个方法中,以便可以在一个地方更改它。我在 lib/due_date.rb 中创建了一个模块并添加了一个方法:

module DueDate
  def due_date(days=10)
    days
  end
end

我已将其包含在某些模型中 class,并且工作正常(这些 class 未嵌套)。我遇到的问题是将它包含在嵌套模型 classes 中。例如,当模型 class 看起来像这样时:

module A
  module B
    class C
      include DueDate
    end
  end
end

我收到以下错误:

undefined local variable or method 'due_date' for #<Class:......>

class C 中,我首先尝试将其分配给在 class 的其他地方使用的常量:

THRESHOLD = due_date

我尝试使用它的第二个地方是在带有 where 子句的 scope 中:

scope :range -> {
  .where("due_date <= NOW() + INTERNAL '#{due_date} days'")
}

如何在嵌套的 classes 中包含我的 DueDate 模块,以便我可以通过这两种方式使用 due_date 方法?

更新: 在 class 中包含模块工作正常,所以这就是我尝试使用不起作用的方法的方式。

如果您希望方法作为实例方法可用,那么您所做的一切都是正确的。

但是,从您的示例来看,您似乎正试图将其用作 class 方法。为此,您需要 extend 模块而不是 include 模块。

module A
  module B
    class C
      extend DueDate

      THRESHOLD = due_date
    end
  end
end

A::B::C::THRESHOLD #=> 10
A::B::C.due_date #=> 10