Использование представлений базы данных с Rails и Postgres для вычисления скользящего среднего - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть таблица с именем Races со связанной Laps, где я храню данные уровня гонок на гонках. Данные на круге выглядят так:

id        racer_id    lap_time  lap_speed   laps_completed  race_id
1         1234           33.5     160              1           1
2         1234           33.5     160              2           1
3         1234           31.25    162              3           1
4         1234           31.25    162              4           1
5         1234           29.5     165              5           1
6         1234           32       161              6           1
7         5678           35       153              1           1
8         5678           35       155              2           1
9         5678           32       158              3           1
10        5678           33.5     160              4           1
11        5678           33       159              5           1
12        5678           32       158              6           1

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

Сейчас у меня есть представление базы данных, которое я добавил в свои миграции:

class CreateLapAverageView < ActiveRecord::Migration[6.0]
  def up
    execute <<-SQL
      CREATE VIEW rolling_lap_averages AS
        SELECT id,
               racer_id,
               race_id,
               laps_completed,
               AVG(lap_speed)
               OVER(ORDER BY laps_completed ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS lap_average_2
        FROM laps
      SQL
  end

  def down
    execute("DROP VIEW rolling_lap_averages")
  end
end

После выполнения необработанного запроса SQL это то, что я хочу, но теперь я Теперь я полностью уверен, как использовать это в моем приложении Rails. Во-вторых, возможно ли передать параметры представлениям базы данных в Rails? Например, вместо OVER(ORDER BY laps_completed ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) я хотел бы сделать что-то вроде OVER(ORDER BY laps_completed ROWS BETWEEN $1 PRECEDING AND CURRENT ROW), чтобы изменить размер окна?

1 Ответ

0 голосов
/ 27 февраля 2020

Вы можете создать модель, которая будет обращаться к данным из вашей таблицы rolling_lap_averages, как и любая другая модель:

class RollingLapAverage < ApplicationRecord
  self.primary_key = :id

  belongs_to :race
  belongs_to :racer

  def readonly?
    true
  end
end

avg = RollingLapAverage.find(6)
avg.lap_speed # => 162.666666667
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...