Rails 5.2+ / PostgreSQL: агрегатная функция «средняя», вычисляющая длительность между двумя столбцами datetime - PullRequest
0 голосов
/ 23 декабря 2018

Обновление 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  |
|-------|---------|------------------|
...