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

问题描述

我认为这应该工作

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拒绝是错误的。对我来说,使用本地生产中使用相同数据库的好处就是一个很好的例子。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...