1

由于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 Metricname = '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 拒绝时有过错。对我来说,使用相同的数据库进行本地开发和生产的好处的一个很好的例子。

4

1 回答 1

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
于 2013-05-07T11:26:11.140 回答