问题描述
我认为这应该工作
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
解决方法
多亏了Erwin Brandstetter在我之前的问题“具有has_many关系的订单”中的帮助,我的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和一个Metric具有一个name和一个value。我查询订单Articles由最高 value的的最近 Metric用name = ‘score’。
谢谢!
解决方案:
感谢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拒绝是错误的。对我来说,使用本地生产中使用相同数据库的好处就是一个很好的例子。