更好的方式提供日期范围

时间:2016-06-23 11:07:06

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

我在rails中创建了这样的日期时间范围:

last_3_months = (Date.today - 3.month)..Date.today
next_40_days = Date.today..(Date.today + 40.days)

Ruby中是否有更好的方法使其更具可读性? 类似的东西:

last_3_months = 3.months.ago.to_range
next_40_days = 40.days.from_now.to_range

非常感谢!

2 个答案:

答案 0 :(得分:4)

Rails没有提供任何帮助方法来从日期创建日期范围。所以对你的问题的简短回答是“不”。

但是,您可以使用ActiveSupport::Duration的方法稍微提高代码的可读性。当您执行3.months等操作时会返回。

3.month.ago.to_date..Date.current
Date.current..40.days.from_now.to_date

如果您决定对一个类进行monkeypatch以添加其他功能,那么它应该是ActiveSupport::Duration而不是内置的Time / DateTime类。

注意:

您正在将ActiveSupport::TimeWithZone类实例与不支持时区的类的实例混合(Date)。 3.months.ago返回ActiveSupport::TimeWithZone的实例,并且您正在添加范围的另一侧,而没有任何时区信息。这可能导致难以捕获错误。因此,最好使用Date.current代替Date.today

答案 1 :(得分:1)

您可以按如下方式“猴子修补”Time课程:

class Time
  def to_range
    self > Date.today ? (Date.today..self.to_date) : (self.to_date..Date.today)
  end
end

3.days.ago.to_range
# => Mon, 20 Jun 2016..Thu, 23 Jun 2016 
3.days.from_now.to_range
# => Thu, 23 Jun 2016..Sun, 26 Jun 2016