У меня есть рабочий SQL-запрос благодаря помощи Эрвина Брандштеттера в моем предыдущем вопросе 'Заказ с отношением has_many'.
Как мне превратить этот SQL в запрос ActiveRecords или AREL для использования в области видимости?
SELECT a.*
FROM articles a
LEFT JOIN (
SELECT DISTINCT ON (article_id)
article_id, value
FROM metrics m
WHERE name = 'score'
ORDER BY article_id, date_created DESC
) m ON m.article_id = a.id
ORDER BY m.value DESC;
Ближе всего я пришел с помощью друзей ...
scope :highest_score, select("articles.*").joins("LEFT JOIN (SELECT
DISTINCT ON (article_id) article_id, value FROM metrics WHERE name =
'score' ORDER BY article_id, date_created DESC) ON metrics.article_id =
articles.id").order("metrics.value DESC")
... что дает мне ошибку:
ActiveRecord::StatementInvalid: PGError:
ERROR: subquery in FROM must have an alias
ОБНОВЛЕНИЕ:
В моем предыдущем вопросе есть полное описание соответствующей схемы и запроса. Но в основном Articles have_many Metrics
, а Metric
имеет name
и value
. Мой запрос упорядочивает Articles
по наибольшему value
из последних Metric
с name = 'score'
.
Спасибо!
РЕШЕНИЕ:
Спасибо Маттерику за то, что указал мне правильное направление! Его запрос работает на SQLite, но из-за (соответствующей) нетерпимости postgresql к двусмысленности окончательная рабочая область:
scope :highest_score, joins(:metrics).where("metrics.name" => "score")
.order("metrics.value desc").group("metrics.article_id",
"articles.id", "metrics.value", "metrics.date_created")
.order("metrics.date_created desc")
Вопрос SO, на который Материк ссылался в своих комментариях, объясняет проблему здесь — и почему sqlite виноват в принятии неоднозначных запросов, а postgresql — в отказе. Для меня это хороший пример преимущества использования той же базы данных для локальной разработки, что и для производства.