将SQL查询转换为Rails AREL查询?

时间:2013-05-07 10:46:19

标签: ruby-on-rails ruby-on-rails-3 activerecord arel

在我之前的问题“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 MetricsMetricnamevalue。我的查询通过最新 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拒绝接受错误。对于我来说,使用相同的数据库进行本地开发和生产的好处就是一个很好的例子。

1 个答案:

答案 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