使用 ActiveSupport 创建单个时间单位(分钟、周等)

Creating a single unit of time (minute, week etc) with ActiveSupport

使用 ActiveSupport 的 extensions to Numeric,可以写下以下内容以获得两分钟:2.minutes

不过,在某些情况下,只有几个时间单位很重要。假设您的应用程序可以 运行 每 天、每周或每月 执行一项任务,具体取决于一些输入:

@frequency = :day # can be any of the following: [:day, :month, :week]

天真地使用 ActiveSupport 对 Numeric 的扩展,我们可以这样做来确定何时 运行 任务:

def run_every
  1.send(@frequency)
end

会调用Numeric中的days实例方法(day方法是别名)

在这种情况下,我们只对一个分钟、天、周、月、年等感兴趣。是否有更好的方法来实例化单个时间单位other比我描述的那个?

TL;DR:这个答案只说 "you got it right"

这似乎是对 send 方法的合理使用:您必须根据频率(日、月、年)获得时间单位,因此使用 send以频率作为方法名称的数字在我看来像是 send.

的完美用例

编辑:正如 Jordan 所说,作为一个好习惯,您应该只使用 public_send 而不是 send。这是因为你可以使用 send 访问私有方法,这通常不被推荐。

# can be any of the following: [:day, :month, :week]

我会改用散列,例如:

DURATIONS = { day: 1.day, week: 1.week, month: 1.month }.freeze

def run_every
  DURATIONS[@frequency]
end