私はArticles
その have_manyを持っていますMetrics
。Articles
Metric.name = "score" の場合、特定の Metric.value で並べ替えたいと思います。(Metric
さまざまな記事の統計を「名前」と「値」のペアとして記録します。記事には複数のメトリック、さらには複数の「スコア」を含めることができますが、私は最新のものだけを並べることに関心があります。)
class Article
has_many :metrics
class Metric
# name :string(255)
# value :decimal(, )
belongs_to :article
これを行うためのスコープを書くのに苦労しています-何かアイデアはありますか? このようなもの?
scope :highest_score, joins(:metrics).order('metrics.value DESC')
.where('metrics.name = "score"')
アップデート:
記事には多くの「スコア」が
metrics
テーブルに格納されている場合があります (毎週/毎月/毎年計算されるため) が、私は最初に見つかった (最新の) 「スコア」を任意の 1 つの記事に使用することにのみ関心があります。モデルには、Metric
DESCending 順序を保証する default_scope があります。「metrics.value DESC」の引用位置のタイプミスを修正しました。
友達に電話している uber rails ハッカーと話していると、これには未加工の SQL クエリが必要なようです。今、私は頭を抱えています...(それが役立つ場合はPostgresを使用しています。)
ありがとう!
更新 2:
Erwin の素晴らしい SQL クエリの提案のおかげで、動作する生の SQL クエリができました。
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;
article_list_by_desc_score = ActiveRecord::Base.connection.execute(sql)
これは、記事データを表すハッシュの配列を提供します (記事オブジェクトではありません??)。
フォローアップの質問:
これをRailsのアクティブレコードクエリに変換する方法はありますか? (そのため、スコープで使用できます)
ソリューションの更新:
誰かが最終的な ActiveRecord クエリを探している場合 - この質問で私を助けてくれた Mattherick に感謝します。最終的な作業クエリは次のとおりです。
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")
みんな、ありがとう!