【问题标题】:query , can not select column count查询,不能选择列数
【发布时间】:2013-08-23 10:10:31
【问题描述】:
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">]

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

【问题讨论】:

  • 只选择count(tags.id)是否有效?
  • 是的,但它只返回计数列

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


【解决方案1】:

您是否尝试过对返回的Tag 对象之一调用count 方法?仅仅因为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)

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

【讨论】:

  • 它返回一个数组 nil: [nil,nil,nil,...] 我想要的结果是 tags.id,tags.name 和 count。
  • 您是否尝试过将 count 称为其他名称,以确保您不会与其他名称发生冲突?
  • 不,就像我上面的查询
  • @Peter_175 你介意分享给你nil: [nil, ...]结果的代码吗?
  • @Peter_175 感谢您回复我们。 :-)
【解决方案2】:

更新:这个答案的原始版本错误地描述了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,了解您可以选择的各种方法的信息。

【讨论】:

  • 你确定吗?我刚刚做了一个Model.select('count(id) as count').map(&amp;:count) 并得到了回复。
  • 我不相信您调用的 count 方法对应于 SQL 中的计数列。如果我使用as foomap(&amp;:foo),我会收到method not found 错误,尽管它适用于count
  • 是的,如果你这样做User.select('count(id) as count').method(:count),你会得到=&gt; #&lt;Method: ActiveRecord::Relation(ActiveRecord::Calculations)#count&gt;
  • 我发现有趣的一件事是,如果您使用 select 方法将现有字段的名称用作计数列名称,ActiveRecord 将继续并将计数结果放入该字段在它合成的记录中。
  • 实际上是正确的计数,将其更改为as x&amp;:x 会产生相同的结果。并且注意User.select('count(id) as count').method(:count)User.select('count(id) as count').map(&amp;:count)所涉及的方法是有区别的。
猜你喜欢
  • 1970-01-01
  • 2013-04-23
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多