Rails хэш и массивы - PullRequest
1 голос
/ 25 мая 2011

Я делаю расписание, но у меня есть проблемы.Я хочу, чтобы это выглядело так:

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 %>

Это дает мне часы проекта на каждую дату, но если есть дата без часов, то нетвыводится, и таблица становится неправильной.

Если в среду нет часов, то в четверг в столбце среды заканчиваются часы четверга.

Какие-либо советы о том, как это сделать?Возможно, есть лучший способ?

РЕШЕНИЕ:

Спасибо за ответы и комментарии.Решение было следующим:

<% 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 %>

<% end%>

Где @dates - это массив дат в диапазоне времени.Теперь рефакторинг ...;)

Ответы [ 2 ]

1 голос
/ 25 мая 2011

вы можете сделать это:

<% 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 голосов
/ 25 мая 2011

В вашей базе данных у вас может быть 0 по умолчанию для всех часов, поэтому оно не может быть пустым.

Но если вы храните часы в журналах, то вы не можете сделать это выше. В этом случае используйте

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

Или же вы можете использовать что-либо кроме 0, чтобы таблицы не мешали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...