以前の質問 ' Order with a has_many relationship ' でのErwin Brandstetterの助けのおかげで、SQL クエリが機能しています。
この 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
に、 and にMetric
は aname
と aがあり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")
Matherick がコメントで言及した SO の質問は、ここで問題を説明しています。本番用とローカル開発用に同じデータベースを使用する利点の良い例です。