使用 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
使用 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