0

I'm trying to get the current day name in an object which I can then use to perform a basic calculation. Going around in circles currently.

I've got some attributes like this:

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

I'm using these to figure out whether Time.now is within the range:

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

That works fine. However, I wanted to dry things up and tried this:

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

But, that gives an error about the wrong constant name. Was clutching at straws.

What's the best way to get the name of the current day in the object so I can use in a lookup?

4

2 回答 2

4

大致:

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

但是,至少,该功能应该包含在任何类@location中,否则主线代码会被不相关的代码弄得一团糟。

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

于 2013-05-05T14:34:45.437 回答
0

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

但总的来说,由于所有特殊情况,日期算术非常困难。甚至 Ruby 也不完全支持它,因为它太难了。但即使 Ruby 对“夏季时间”一无所知,您最好还是使用DateDateTime作为基础,而不是尝试自己动手。

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

于 2013-05-05T20:56:03.340 回答