Ruby on rails ActiveRecord 4.2包括并按计数排序

Ruby on rails ActiveRecord 4.2包括并按计数排序,ruby-on-rails,ruby,postgresql,activerecord,Ruby On Rails,Ruby,Postgresql,Activerecord,我正在写一个搜索我正在做的项目。它的目的是能够搜索文章的主体并生成作者列表,按匹配文章的数量排序,仅包括相关文章,而不是所有文章 我目前有以下疑问: Author.includes(:articles).where('articles.body ilike ?', '%foo%').references(:articles) 在本例中使用include可以使所有相关文章(而不是所有文章)都预加载,这正是我想要的。然而,当涉及到按包含文章的数量订购时,我不确定如何继续 我应该注意我想在Activ

我正在写一个搜索我正在做的项目。它的目的是能够搜索文章的主体并生成作者列表,按匹配文章的数量排序,仅包括相关文章,而不是所有文章

我目前有以下疑问:

Author.includes(:articles).where('articles.body ilike ?', '%foo%').references(:articles)
在本例中使用include可以使所有相关文章(而不是所有文章)都预加载,这正是我想要的。然而,当涉及到按包含文章的数量订购时,我不确定如何继续

我应该注意我想在ActiveRecord中这样做,因为分页将在查询之后应用。不是在Ruby解决方案之后

我应该注意到我使用的是PostgreSQL 9.3

编辑:使用原始SQL

这似乎是独立的,就像这样:

作者。包括:articles.where'articles.body ilike?','%foo%'。引用:articles.select'authors.*,从articles.Author\u id=authors.id的文章中选择COUNT0作为文章计数。顺序为'article\u count DESC'

这个很好用。但是,如果我加上.limit1,它就会断开

PG::UndefinedColumn:错误:列项目计数不存在

知道为什么增加限制会打破它吗?这个问题看起来也很不一样


选择DISTINCT authors.id,article_count AS alias_0 FROM authors LEFT OUTER JOIN articles ON articles.author_id=authors.id WHERE articles.body I类似“%microsoft%”按文章数量排序描述限制1

我认为没有现成的解决方案。要做到这一点,您必须编写原始sql,但可以将其与现有ActiveRecord查询相结合

所以这里唯一要解释的就是选择部分。第一部分authors.*选择authors表下的所有字段,这是默认值。因为我们还想计算文章的数量,所以我们创建一个子查询,并将其结果作为作者的伪列之一传递,我们称之为article_count。最后一部分是使用article\u count调用order

此解决方案假定有几件事情需要根据设置进行微调

rails中的Author by约定映射到authors表。如果它是一个从用户类继承的STI,并且正在使用users表,则需要将作者更改为用户。 articles.author\u id假定外键是author\u id,本质上,一篇文章只由一位作者撰写。更改为外键的任何内容。
因此,您将有一组作者,按他们所写文章的数量排序。

我用更多信息更新了这个问题。你的建议本身很好,但当我尝试添加一个limit子句时,它崩溃了,说没有名为article_count的列。实际上,我也不知道添加limit时发生了什么,但我做了一些检查,结果表明添加limit将导致两个sql调用。第一个是引发错误的查询,rails这样做是为了获取作者的ID。这里不使用select部分,而使用order部分,因此出现了错误。下一个sql查询用于实际加载使用select部件的作者。所以我想没有ActiveRecord方法来做你想做的事情。看来你是对的,我用两个独立的查询来实现这一点。无论如何,我将在未来改进我的搜索后端,所以这不是一个大问题。谢谢你的帮助。我想补充一点,如果将来有人通过谷歌来到这里,我可以在一个查询中做到这一点,就像这个答案中描述的那样,然后使用它提供的分页。我觉得这是一个比做两个查询更好的解决方案。
Author
  .includes(:articles)
  .select('authors.*, (SELECT COUNT(0) FROM articles WHERE articles.author_id = authors.id) AS article_count')
  .order('article_count DESC')