2013-05-07 88 views
1

我有一個有效的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 MetricsMetric有一個name和一個value。我的查詢訂單Articles最高的value的最近的Metricname = '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拒絕。對我來說,使用相同的數據庫作爲生產的本地開發的好處。

+1

請問你的模式和關聯是什麼樣子?使用這些信息可以更容易地嘗試查詢;)。沒有更多的信息,也許這個作品: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

+0

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

回答

1

我認爲這應該工作

class Article < ActiveRecord::Base 

    scope :highest_score, lambda { Article.joins(:metrics).where("metrics.name" => "score").order("metrics.value").group(:article_id).order("metrics.article_id desc").order("metrics.date_created desc") } 

end 
+0

謝謝Mettherick。不幸的是我得到這個錯誤:ActiveRecord :: StatementInvalid:PGError:錯誤:列metrics.score不存在。第1行:... P BY article_id ORDER BY metrics.article_id desc,metrics.sc ...儘管我認爲您的查詢錯過了一些內容,即Metric.value爲Metric.name =「score 」。謝謝你看看! – 2013-05-07 11:44:42

+0

更新了我的回答,但我不再舒服:)。我沒有得到一個ActiveRecord :: StatementInvalid:PGError:錯誤。我簡單地在我的本地機器上用sqlite3試了一下。 – Mattherick 2013-05-07 11:52:26

+1

正如我現在看到你正在得到PostgressError,也許這個問題可以幫助你http://stackoverflow.com/questions/16418504/pgerror-in-group-by-clause – Mattherick 2013-05-07 12:27:37