【发布时间】:2011-05-26 02:50:52
【问题描述】:
我正在制作时间表,但我遇到了问题。 我希望它看起来像这样:
projects |Monday Tuesday Wednesday Thursday Friday Saturday Sunday
development| 3:50 4:00 5:00 3:00 0:00 0:00 0:00
Testing | 0:00 0:00 0:00 2:00 4:00 0:00 0:00
Lanch | 0:00 0:00 0:00 0:00 1:00 6:00 0:00
每个项目都有_many 以小时为字段的日志。
我做了这个查询:
@log_week_project = current_user.logs.where(:log_date => (Time.now.beginning_of_week + 1.second)..(Time.now.end_of_week - 1.second)).group("project_id").group("date(log_date)").sum(:hours)
得到这个:
<OrderedHash {[2, "2011-05-24"]=>31800.0, [1, "2011-05-24"]=>10200.0, [1, "2011-05-23"]=>25200.0, [1, "2011-05-26"]=>19800.0}>
散列中的键是一个数组,其中project_id @ [0] 和log_date @ [1]。值是小时数。
我认为这样做:
<% for project in @projects do %>
<%= project.name %>
<% @log_week_project.map do |key,hours|%>
<% if key[0] == project.id %>
<%= time_diff(hours)%>
<% end %>
<% end %>
<% end %>
这给了我每个日期的项目小时数,但如果有一个没有小时数的日期,则没有输出并且表格出错。
如果星期三没有营业时间,则星期四的营业时间将出现在星期三列中。
关于如何做到这一点的任何提示?也许有更好的方法?
解决方案:
感谢您的回复和 cmets。解决方案是:
<% for project in @projects do %>
<%= project.name %>
<% @dates.each do |date| %>
<% hours = @log_week_project.detect { |key| key[0][0].to_i == project.id && key[0][1].to_time.strftime('%a') == date.to_time.strftime('%a')}%>
<%= hours ? time_diff(hours[1]) : "0:00"%>
<% end %>
其中@dates 是时间范围内的日期数组。现在重构... ; )
【问题讨论】:
-
如果 current_user.logs.first.log_date == Time.now.beginning_of_week 怎么办?这将在您的查询中遗漏。
标签: ruby-on-rails arrays hash