【问题标题】:Rails hash and arraysRails 哈希和数组
【发布时间】: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


【解决方案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 %>

接下来,重构它以将所有逻辑放在一个助手中。 希望对你有帮助

【讨论】:

  • 感谢您的好建议。当我尝试它时,我没有得到任何东西。所以我尝试了&lt;% hours = @log_week_project.detect{|key| key[0].to_i == project.id &amp;&amp; key[1] == date } %&gt; 并得到了这个错误undefined method to_i' for [1, "2011-05-23"]:Array`
  • 我会以不同的方式执行此操作,但您对 Array 上的 to_i 的问题是因为检测位于 A Hash... 这需要 |key, value|... 其中的关键case 是一个数组。
【解决方案2】:

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

但是,如果您将小时数存储在日志中,则无法执行上述操作。在这种情况下,使用

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

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

【讨论】:

  • 谢谢。日志将 hours 和 project_id 作为字段。问题是,当我对哈希进行循环时,在这种情况下它只运行了四次。第一个项目三次,第二个项目一次。小时总是存在的。它不知道一周有 7 天。
  • 或者只是 time_diff(小时) || 0
猜你喜欢
  • 2019-04-06
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多