Рельсы рассчитывают общую продолжительность времени по дням и неделям

#ruby-on-rails #time #duration #calculation

Вопрос:

У меня есть небольшое приложение для учета рабочего времени, которое я создаю с использованием Rails 6.0.4. Я запустил:

 rails g scaffold Meetings name:string start_date:datetime end_date:datetime duration:integer
 

Продолжительность-это вычисляемое поле, которое я сохраняю в базе данных в моей модели meetings.rb:

 before_save :set_duration

def daily_total_duration
  Meeting.where("start_date >= ? AND end_date  < ?", Time.now.beginning_of_day, Time.now.end_of_day).sum(:duration)
end

def weekly_total_duration
  Meeting.where("start_date >= ?", Time.now.beginning_of_week).sum(:duration)
end

def set_duration
  self.duration = (end_date - start_date).to_i
end
 

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

В моей Meeting модели у меня есть следующие 2 метода, которые, похоже, не работают:

 def daily_total_duration
  Meeting.where("start_date >= ? AND end_date < ?", Time.now.beginning_of_day, Time.now.end_of_day).sum(:duration)
end

def weekly_total_duration
  Meeting.where("start_date >= ?", Time.now.beginning_of_week).sum(:duration)
end
 

В моем meetings.index.html.erb у меня есть, например:

 <tbody>
  <% @meetings.each do |meeting| %>
    <tr>
      <td><%= meeting.name %></td>
      <td><%= meeting.start_date %></td>
      <td><%= meeting.end_date %></td>
      <td><%= meeting.duration %></td>
      <td><%= duration_display meeting  %></td>
      **<td><%= meeting.daily_total_duration %></td>**
      **<td><%= meeting.weekly_total_duration %></td>**
      <td><%= link_to 'Show', meeting %></td>
      <td><%= link_to 'Edit', edit_meeting_path(meeting) %></td>
      <td><%= link_to 'Destroy', meeting, method: :delete, data: { confirm: 'Are you sure?' } %></td>
    </tr>
  <% end %>
</tbody>
 

Может ли кто-нибудь помочь мне решить эту проблему, так как я, похоже, не могу получить результат, который я хочу, работая на изображении ниже. Например, мне нужно суммировать продолжительность первых двух строк (2021/8/01), поскольку они происходят в один и тот же день, но происходит то, что метод суммирует только продолжительность текущего дня сегодня (2021/8/01) = 57600 на изображении ниже. Вместо этого это должны быть отдельные дни.

введите описание изображения здесь

Комментарии:

1. В своем запросе, Meeting.where("created_at >= ? AND created_at < ?", Time.now.beginning_of_day, Time.now.end_of_day).sum(:duration) , вы имели в виду использовать created_at или start_date ?

2. Привет, Мэгзи, да, вы правы, я отредактировал свой вопрос, но, похоже, я не могу заставить это работать, я получаю ошибку без метода при встрече#индекс неопределенного метода `daily_total_duration’ для #<Встреча:0x0000560f29ac9fe8>

3. Эта проблема означает, что, возможно, в запросе нет ничего неправильного.

4. Можете ли вы опубликовать больше кода из meeting.rb файла, потому что я не вижу проблемы, почему контроллер не может видеть метод daily_total_duration , если он не объявлен закрытым?

5. Ты должен сделать что-то подобное: Meeting.where("start_date >= ? AND end_date < ?", self.start_date.beginning_of_day, self.start_date.end_of_day).sum(:duration)