在对象Ruby on Rails中获取日期名称

时间:2013-05-05 14:03:12

标签: ruby ruby-on-rails-3

我正在尝试在对象中获取当前日期名称,然后我可以使用该名称执行基本计算。目前绕圈子。

我有一些这样的属性:

 @location.monday_on
 @location.monday_off
 @location.tuesday_on
 .....

我正在使用它们来确定Time.now是否在范围内:

(@location.monday_on.to_i..@location.monday_off.to_i).include? Time.now.hour

工作正常。但是,我想把事情弄干净并尝试过这个:

start = "@location.#{Time.now.strftime('%A').downcase}_on".constantize
finish = "@location.#{Time.now.strftime('%A').downcase}_off".constantize

(start.to_i..finish.to_i).include? Time.now.hour

但是,这给出了错误的常量名称的错误。抓着稻草。

在对象中获取当天名称的最佳方法是什么,以便我可以在查找中使用?

2 个答案:

答案 0 :(得分:4)

大致是:

@location.send("#{Time.now.strftime('%A').downcase}_on".to_sym)

但是,在非常至少,该功能应该包含在@location类中,否则主线代码会被不相关的代码混乱。

我可能已将这些函数的结果封装在散列或数组中,并传入日期名称或DoW编号。如果在DSL或其他面向用户的工件中使用它们,那么创建特定于日期的方法是很好的,否则我不相信它们的实用性。

答案 1 :(得分:0)

仅仅因为你可以使用元编程并不意味着你应该。元编程很有趣,在某些情况下可以帮助您编写更易读的代码,但是,正如您的示例所示,它可能会导致看起来很糟糕的数据驱动代码。老实说,我甚至无法确定通过查看您的代码了解您要做的事情。

一般而言,由于所有特殊情况,日期算术非常困难。即使Ruby也不完全支持它,因为它太难了。但即使Ruby对“夏令时”的无知,最好还是以DateDateTime为基础,而不是试图自己动手。

通常,您不应该尝试在计算中使用日期名称。相反,使用日期数字(即工作日为0..6)并且仅在必要时使用Date::DAYNAMES[weekday]之类的内容转换为字符串。然后你可以使用像@location.wday == DateTime.now.wday

这样的东西