使用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
方法是别名)。
在这种情况下,我们只对一个分钟,日,周,月,年等感兴趣。是否有更好的方法来实例化我所描述的单个时间单位之外的单位时间?
答案 0 :(得分:1)
TL; DR:这个答案只说"你做对了"
使用send
方法似乎相当合理:您必须根据频率(日,月,年)获得时间单位,因此在数字上使用send
作为方法名称的频率在我看来就像send
的完美用例。
public_send
代替send
作为一个好习惯。这是因为您可以使用send
访问私有方法,这通常不建议使用。
答案 1 :(得分:1)
# 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