查询,无法选择列数

时间:2013-08-21 06:51:36

标签: ruby-on-rails ruby activerecord rails-activerecord

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">]

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

2 个答案:

答案 0 :(得分:3)

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

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

只会包含Tag类知道的内容,而Tag只会知道tags表中的列:您只有id和{{1在表中,这就是你所看到的一切。

如果你这样做:

name

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

count

你会看到你期待的一系列计数。

答案 1 :(得分: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