Ruby on rails 将SQL查询转换为Rails AREL查询?
由于在我前面的问题“”中的帮助,我有了一个可以正常工作的SQL查询 如何将此SQL转换为ActiveRecords或AREL查询以在作用域中使用Ruby on rails 将SQL查询转换为Rails AREL查询?,ruby-on-rails,ruby-on-rails-3,activerecord,arel,Ruby On Rails,Ruby On Rails 3,Activerecord,Arel,由于在我前面的问题“”中的帮助,我有了一个可以正常工作的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, d
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
更新:
我前面的文章完整描述了相关的模式和查询。但是基本上,文章有很多度量标准,而度量标准有一个名称和一个值。我的查询顺序为文章
按最新指标
的最高值
排序,其中名称='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在评论中提到的这个问题解释了这里的问题——以及为什么sqlite在接受含糊不清的查询时出错,而不是在拒绝postgresql时出错。对于我来说,使用相同的数据库进行本地开发和生产的好处是一个很好的例子。我认为这应该是可行的
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
类文章“score”).order(“metrics.value”).group(:Article\u id).order(“metrics.Article\u id desc”).order(“metrics.date\u created desc”)}
结束
我认为这应该行得通
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
类文章“score”).order(“metrics.value”).group(:Article\u id).order(“metrics.Article\u id desc”).order(“metrics.date\u created desc”)}
结束
您的模式和关联是什么样子的?有了这些信息,您可以更轻松地尝试查询;)。如果没有更多信息,这可能会起作用:范围:最高评分,lambda{Article.all.includes(:metrics).where(:name=>“score”).order(“Article_id desc and date_created desc”)}谢谢Mattherick!我不想双重发布信息,因为我的模式和关联在第一个问题中有描述:-但基本上文章有很多度量,度量有名称和值。我的查询按名称为'score'的最新度量的最高值对文章进行排序。谢谢你能给我的帮助!DJ您的模式和关联看起来如何?有了这些信息,您可以更轻松地尝试查询;)。如果没有更多信息,这可能会起作用:范围:最高评分,lambda{Article.all.includes(:metrics).where(:name=>“score”).order(“Article_id desc and date_created desc”)}谢谢Mattherick!我不想双重发布信息,因为我的模式和关联在第一个问题中有描述:-但基本上文章有很多度量,度量有名称和值。我的查询按名称为'score'的最新度量的最高值对文章进行排序。谢谢你能给我的帮助!谢谢梅瑟里克。不幸的是,我遇到了以下错误:ActiveRecord::StatementInvalid:PGError:error:column metrics.score不存在。第1行:…P按文章\u id按度量排序。文章\u id说明,度量。sc。。。尽管我认为您的查询遗漏了一些内容,即按照Metric.value for Metric.name=“score”对文章进行排序。谢谢你看!更新了我的答案,但我不再是舒尔:)。我没有得到ActiveRecord::StatementInvalid:PGError:ERROR。我在本地机器上用sqlite3简单地试用了一下。现在我看到你收到了一个PostgressError,也许这个问题可以帮助你谢谢Matherick。该链接有助于解释问题,并引导我使用您的查询找到解决方案。再次感谢!ANS:scope:highest_score,lambda{Article.joins(:metrics).where(“metrics.name”=>“score”).order(“metrics.value desc”).group(“metrics.Article\id”、“articles.id”、“metrics.value”、“metrics.date\u created”).order(“metrics.date\u created desc”)}是的,我认为lambda在rails 3.2中不是必需的,但是rails 4会收到一个弃用警告,如果我没弄错的话,也可以直接说是个错误。谢谢Mettherick。不幸的是,我遇到了以下错误:ActiveRecord::StatementInvalid:PGError:error:column metrics.score不存在。第1行:…P按文章\u id按度量排序。文章\u id说明,度量。sc。。。尽管我认为您的查询遗漏了一些内容,即按照Metric.value for Metric.name=“score”对文章进行排序。谢谢你看!更新了我的答案,但我不再是舒尔:)。我没有得到ActiveRecord::StatementInvalid:PGError:ERROR。我在本地机器上用sqlite3简单地试用了一下。现在我看到你收到了一个PostgressError,也许这个问题可以帮助你谢谢Matherick。该链接有助于解释问题,并引导我使用您的查询找到解决方案。再次感谢!ANS:scope:highest_score,lambda{Article.joins(:metrics).where(“metrics.name”=>“score”).order(“metrics.value desc”).group(“metrics.Article\id”、“articles.id”、“metrics.value”、“metrics.date\u created”).order(“metrics.date\u created desc”)}是的,我认为lambda在rails 3.2中不是必需的,但是rails 4会收到一个弃用警告,如果我没弄错的话,也可能是直接的错误。