我有一個有效的SQL查詢感謝Erwin Brandstetter在我以前的問題'Order with a has_many relationship'的幫助。將SQL查詢轉換爲Rails AREL查詢?
如何將此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
UPDATE:
我早期的question對相關模式有完整的描述和查詢。但基本上Articles have_many Metrics
和Metric
有一個name
和一個value
。我的查詢訂單Articles
由最高的value
的最近的Metric
與name = 'score'
。
謝謝!
SOLUTION:
感謝Mattherick指着我在正確的方向!他查詢工作在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問題在這裏說明問題 - 爲什麼SQLite是在接受含糊不清的查詢而不是postgresql拒絕。對我來說,使用相同的數據庫作爲生產的本地開發的好處。
請問你的模式和關聯是什麼樣子?使用這些信息可以更容易地嘗試查詢;)。沒有更多的信息,也許這個作品:scope:highest_score,lambda {Article.all.includes(:metrics).where(:name =>「score」)。order(「article_id desc and date_created desc」)} – Mattherick 2013-05-07 10:53:02
Thanks Mattherick!我不希望雙重張貼信息,因爲我的模式和關聯在第一個問題中描述:http://stackoverflow.com/questions/16382606/order-with-a-has-many-relationship - 但基本上文章has_many度量標準,並且度量標準具有名稱和值。我的查詢按最近的Metric的最高值命名文章,其中name ='score'。謝謝你提供的所有幫助! dj – 2013-05-07 10:57:31