Обновление 2018-12-24 09: 45
Решение, которое я придумала, заключается в добавлении столбца duration_in_seconds
и сохранении там разницы между двумя временными метками изатем выполните вычисления, используя это значение в секундах.Это работает, но мне также все еще интересно узнать о проблеме, возникшей у меня с PostgreSQL и функцией average()
.
Оригинальный вопрос
Я строюмеханизм отчетности в приложении, и мне нужно отслеживать продолжительность, которую records
тратит в каждом stage
.
class Stage < ApplicationRecord
has_many :record_stages
end
# Join table
class RecordStage < ApplicationRecord
# id:primary_key
# stage_id:integer
# record_id:integer
# left_state_at:datetime
# created_at/updated_at:datetime
belongs_to :stage
belongs_to :record
# Both timestamp datatypes, difference is returned in seconds
def duration_in_seconds
left_stage_at - created_at
end
end
class Record < ApplicationRecord
has_many :record_stages
end
Я рассчитываю продолжительность, потраченную на каждом этапе, с помощью record_stage.left_stage_at - record_stage.created_at
(вы вводите)stage
при его создании).
Это позволяет record
иметь несколько stages
, и я могу отслеживать, сколько времени record
провел в каждом stage
.
Одиночная запись (работает так, как я ожидаю)
record_stage = RecordStage.first
duration = record_stage.duration_in_seconds # => 447.966037
ActiveSupport::Duration.build(duration) # => 7 minutes and 27.966037 seconds
Несколько записей (отчетность, а не то, что я ожидаю)
Однако, когдаЯ пытаюсь выполнить агрегатную average
функцию для этого, используя Rails 5.2 и PostgreSQL, я не получаю то, что ожидаю:
stage = Stage.first # => ie, "First Stage"
record_stages = stage.record_stages # Just the 1 record from above in my system
average_duration = record_stages.average("left_stage_at - created_at") # => 0.0
Вопрос
Как рассчитать среднюю продолжительность для коллекции record_stages
?
Я знаю, что, вероятно, неправильно понимаю, как работает агрегат PostgreSQL average
, bно я не уверен, что мне не хватает.
Конечная цель - создать таблицу, подобную этой:
|-------|---------|------------------|
| Stage | Records | Average Duration |
|-------|---------|------------------|
| First | 4 | 2 weeks, 4 days |
|-------|---------|------------------|
| ... | 7 | 4 weeks, 5 days |
|-------|---------|------------------|