1
Tag.joins(:quote_tags).group('quote_tags.tag_id').order('count desc').select('count(tags.id) AS count, tags.id, tags.name')

Build query:
SELECT count(tags.id) AS count, tags.id, tags.name FROM `tags` INNER JOIN `quote_tags` ON `quote_tags`.`tag_id` = `tags`.`id` GROUP BY quote_tags.tag_id ORDER BY count desc

结果:

[#<Tag id: 401, name: "different">, ... , #<Tag id: 4, name: "family">]

它不会为我返回计数列。我怎么才能得到它?

4

2 回答 2

3

您是否尝试过count在其中一个返回的Tag对象上调用该方法?仅仅因为inspect不提及count并不意味着它不存在。inspect输出:

[#<Tag id: 401, name: "different">, ... , #<Tag id: 4, name: "family">]

将只包括Tag班级知道的事情,并且Tag只会知道表格中的列tags:您只有表格中的idname,所以这就是您所看到的。

如果你这样做:

tags = Tag.joins(:quote_tags).group('quote_tags.tag_id').order('count desc').select('count(tags.id) AS count, tags.id, tags.name')

然后看看counts:

tags.map(&:count)

您将看到您期望的计数数组。

于 2013-08-21T07:22:13.570 回答
1

更新:这个答案的原始版本被错误地描述select了,后续版本最终有效地重复了来自@muistooshort 的另一个答案的当前版本。我将其保留为当前状态,因为它具有有关使用原始 sql 的信息。感谢@muistooshort 指出我的错误。

尽管您的查询实际上按照其他答案的说明工作,但您始终可以执行原始 SQL 作为替代方案。

您可以选择多种select_...方法,但我认为您会想要使用select_all. 假设您隐式生成的构建查询是正确的,您可以使用它,如下所示:

ActiveRecord::Base.connection.select_all('
  SELECT count(tags.id) AS count, tags.id, tags.name FROM `tags`
    INNER JOIN `quote_tags` ON `quote_tags`.`tag_id` = `tags`.`id`
    GROUP BY quote_tags.tag_id
    ORDER BY count desc')

有关您可以选择的各种方法的信息,请参阅http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/DatabaseStatements.html

于 2013-08-21T07:44:08.860 回答