在我之前的问题“Erwin Brandstetter”中感谢Order with a has_many relationship的帮助,我有一个有效的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
更新
我之前的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拒绝接受错误。对于我来说,使用相同的数据库进行本地开发和生产的好处就是一个很好的例子。
答案 0 :(得分: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