#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)