红宝石时间和变量的比较

时间:2014-08-26 19:17:24

标签: ruby-on-rails ruby

我有两个模型,分别是Employee和WorkingPattern。 Employee的一个实例belongs_to一个工作模式。

工作模式看起来像这样

        :id => :integer,
      :name => :string,
       :mon => :boolean,
       :tue => :boolean,
       :wed => :boolean,
       :thu => :boolean,
       :fri => :boolean,
       :sat => :boolean,
       :sun => :boolean

我需要知道员工今天是否应该上班。因此,如果今天是星期二,并且该员工的工作模式记录报告:tue = true然后返回true,等等。我没有选择重命名WorkingPattern模型上的字段以匹配日期名称。

我知道

Time.now.strftime("%A")

将返回当天的名称。然后我发现我可以通过

获得字符串的前3个字符
Time.now.strftime("%A")[0,3]

所以现在我将“Tue”作为字符串返回。添加一个小写

Time.now.strftime("%A")[0,3].downcase

现在我有了“tue”,它匹配了WorkingPattern上的tue符号。

现在我需要一种在正确的日期检查字符串的方法,理想情况是这并不意味着每个员工对数据库进行7次查询!

有人可以提供建议吗?

4 个答案:

答案 0 :(得分:5)

您可以使用%a作为缩写的工作日名称。并使用send动态调用方法

employee.working_pattern.send(Time.now.strftime("%a").downcase)

答案 1 :(得分:1)

使用send在对象上调用存储在变量中的方法。

这两者都是相同的:

user.tue # true
user.send('tue') # true

答案 2 :(得分:0)

您可以使用[]访问属性,就像哈希一样。无需使用send甚至attributes

day = Time.now.strftime("%a").downcase
employee.working_pattern[day]

答案 3 :(得分:0)

屠杀弦让我感到有些不安

构建日期数字的哈希:

{0 => :sun
 1 => :mon,
 2 => :tue,
  ...}

然后使用Time.now.wday(或Time.zone.now.wday,如果您想要了解时区)从散列中选择适当的值

然后,您可以使用其他答案所描述的任何方式在employee.working_pattern上使用该字符串:

employee.working_pattern.send(day_name)

employee.working_pattern.read_attribute [DAY_NAME] enployee.working_pattern [DAY_NAME]