2011-05-25 99 views
1

我正在制作一个时间表,但我有问题。 我希望它看起来像这样:Rails哈希和数组

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 

每一个项目的has_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 %> 

这使我对每个日期的项目小时,但如果没有小时日期没有输出和表得到错误的。

如果周三没有小时,星期四小时最后会在星期三列。

有关如何做到这一点的任何提示?也许有更好的办法?

SOLUTION:

感谢答复和意见。解决的办法是:

<% 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处于TIMERANGE的日期的阵列。现在重构...; )

+0

如果current_user.logs.first.log_date == Time.now.beginning_of_week怎么办?这将在您的查询中错过。 – Yule 2011-05-25 12:48:42

回答

1

,你可以这样做:

<% for project in @projects do %> 
    <%= project.name %> 
    <% (1..7).each do |day| %> 
    <% date = "2011-05-#{22 + day}" #please modify this, this is only to keep the example simple %> 
     <% hours = @log_week_project.detect{|key| key[0] == project && key[1] == date } %> 
     "<%= hours ? time_diff(hours) : "" %> 
     <% end %> 
    <% end %> 
    <% end %> 
<% end %> 

接下来,重构这个把所有的逻辑在一个帮手。 希望,这有助于

+0

感谢您的好建议。我尝试时没有得到任何东西。所以我尝试了'<%hours = @ log_week_project.detect {| key |键[0] .to_i ==项目。id && key [1] == date}%>'并且为[1,“2011-05-23”]得到了这个错误'undefined method'to_i':Array' – 2011-05-25 13:16:52

+0

我会这样做,但是你的问题与数组中的to_i是因为检测位于A哈希上...需要|键,值| ...,这里的键是一个数组。 – 2011-05-25 15:33:52

0

在你的数据库中,你可能有0作为所有小时的默认值,这样它就不能为空。

但是,如果你在日志中存储小时,那么你不能在上面做。在这种情况下,请使用

time_diff(hours).present? ? time_diff(hours) : 0 

否则,您可以使用除0之外的其他值,这样表格不会受到干扰。

+0

谢谢。日志具有小时和project_id作为字段。问题是,当我在散列上做一个循环时,在这种情况下它只会四次。第一个项目是第二个项目的三倍。小时已经到了。它不知道一周有7天。 – 2011-05-25 12:49:19

+0

或者只是time_diff(小时)|| 0 – Yule 2011-05-25 12:50:53