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

时间:2021-01-22 17:14:11

标签: ruby ruby-on-rails-5 rspec-rails

在我的代码库中的几个地方,我有一个硬编码的整数,我必须将其拉入一个方法中,以便可以在一个地方进行更改。我在 loading 中创建了一个模块并添加了一个方法:

lib/due_date.rb

我已经将它包含在一些模型类中并且它工作正常(这些类不是嵌套的)。我遇到的问题是将它包含在嵌套模型类中。例如,当模型类如下所示:

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

我收到以下错误:

module A
  module B
    class C
      include DueDate
    end
  end
end

undefined local variable or method 'due_date' for #<Class:......> 中,我首先尝试将其分配给在类中其他地方使用的常量:

class C

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

scope

如何在嵌套类中包含我的 scope :range -> { .where("due_date <= NOW() + INTERNAL '#{due_date} days'") } 模块,以便我可以通过这两种方式使用 DueDate 方法?

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

1 个答案:

答案 0 :(得分:2)

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

但是,从您的示例来看,您似乎正在尝试将其用作类方法。为此,您需要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