Вычислите среднее значение SQL с использованием Arel в ассоциации has_many

#sql #ruby-on-rails #ruby #arel

Вопрос:

У меня есть модель по имени Chart . Диаграмма имеет множество значений chart_axis_values . И каждый chart_axis_value из них принадлежит диаграмме и chart_axis .

 ## /models/chart.rb
class Chart < ApplicationRecord
  has_many :chart_axis_values
end

## /models/chart_axis_value.rb
class ChartAxisValue < ApplicationRecord
  belongs_to :chart
  belongs_to :chart_axis
end

 

chart_axis_value имеет столбец с именем value , который является плавающей точкой , и, конечно, поскольку он принадлежит a chart и a chart_axis , в нем есть столбцы chart_axis_id и chart_id .

chart_axis имеет столбец с именем slug .

То , что я хочу сделать, — это рассчитать среднее значение chart_axis_values.value , но я хочу СГРУППИРОВАТЬСЯ chart_axis.slug и хочу рассчитать его для всех диаграмм (может быть более 1 диаграммы).

Я думал, что SQL-запрос будет чем-то вроде:

 SELECT aa.slug, AVG(aav.value) as axis_average
FROM charts c
INNER JOIN chart_axis_values cav
ON cav.id IN c.chart_axis_value_ids
INNER JOIN chart_axes ca
ON ca.id = cav.chart_axis_id
 

И после этого я подумал, что буду использовать Arel, чтобы использовать его в своей графической модели, в методе под названием «средние значения»,
но я знаю, что мне чего-то не хватает, потому что я не могу заставить его работать. Любая помощь будет оценена по достоинству, спасибо.

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

1. Вы можете выбрать агрегаты с .select('aa.slug', ChartAxisValue.arel_table[:value].avg.as('axis_average')) помощью . Хотя я действительно не понимаю, откуда aa и aav откуда берусь.

2. @макс, Это было моей ошибкой, » aav «должно быть «cav», а «aa» должно быть «ca». Но я понимаю вашу точку зрения, я постараюсь, чтобы это сработало, спасибо

3. Хотя @max верен, ActiveRecord уже предоставляет методы для этого, например ChartAxisValue.join(:chart_axis).group(ChartAxis.arel_table[:slug]).avg(:value) , это вернет хэш {slug => average_value} , учитывая, что это диаграммы, я предполагаю, что этот результат будет более желательным, чем неправильный объект AR.

4. Спасибо! @enginersmnky, ваше предложение на самом деле привело меня к правильному решению и правильному способу решения этой проблемы, которая у меня была. Если вы хотите, вы можете прокомментировать belolw, чтобы я мог предоставить вам решение.