我有两个模型,分别是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次查询!
有人可以提供建议吗?
答案 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]