1

以前の質問 ' 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のものから順に並べ替えます。 Metricname = '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 の質問は、ここで問題を説明しています。本番用とローカル開発用に同じデータベースを使用する利点の良い例です。

4

1 に答える 1