#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, чтобы я мог предоставить вам решение.