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

时间:2016-05-09 14:36:50

标签: ruby-on-rails ruby time 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方法是别名)。

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

2 个答案:

答案 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