由于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
, and aMetric
有 aname
和 a value
。我的查询Articles
按最近的最高 排序。value
Metric
name = 'score'
谢谢!
解决方案:
感谢 Matherick 为我指明了正确的方向!他的查询适用于 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 question 解释了这里的问题——以及为什么 sqlite 在接受模棱两可的查询而不是 postgresql 拒绝时有过错。对我来说,使用相同的数据库进行本地开发和生产的好处的一个很好的例子。