我在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
非常感谢!
答案 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