Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 将SQL查询转换为Rails AREL查询?_Ruby On Rails_Ruby On Rails 3_Activerecord_Arel - Fatal编程技术网

Ruby on rails 将SQL查询转换为Rails 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

由于在我前面的问题“”中的帮助,我有了一个可以正常工作的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
更新:

我前面的文章完整描述了相关的模式和查询。但是基本上,
文章有很多度量标准,而
度量标准有一个
名称和一个
值。我的查询顺序为
文章
按最新
指标
的最高
排序,其中
名称='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会收到一个弃用警告,如果我没弄错的话,也可能是直接的错误。