【问题标题】:Count returns the count of all joined data instead of the main objectCount 返回所有连接数据的计数,而不是主对象
【发布时间】:2012-10-25 17:52:06
【问题描述】:

我正在尝试统计养狗的用户。

User.joins(:pets).where("pets.type = ?", :dog).count

这将返回用户数 + 他们的狗的总和,而不是我只想要实际用户数。

我做错了什么?

更新

我还尝试使用上述查询来获取用户,它会返回一个重复多次的相同用户数组,具体取决于他们拥有多少只狗。

【问题讨论】:

  • 为什么不能在宠物模型上这样做?即:Pet.where(type: 'dog').count
  • @Amir 用户可以养多只狗,我也需要用户。

标签: ruby-on-rails activerecord


【解决方案1】:

试试这个:

User.joins(:pets).where("pets.type = ?", :dog).count(distinct: true)

api doc

【讨论】:

  • 这行得通,但是如果我想获取不计数的用户,那么解决方法是什么,实际上会打印重复的用户?
  • 嗯,这似乎没有任何作用,它在SELECT 之后添加了DISTINCT,但它仍然获取重复用户。
  • 真的吗?可以贴一下 SQL 吗?
  • SELECT DISTINCT 'users'.* FROM 'users' INNER JOIN 'pets' ON 'pets'.'user_id' = 'users'.'id' WHERE (pets.type = 'dog')
  • 抱歉,我看不出有任何理由说明此 SQL 不起作用。如果需要,您可以使用 db 客户端进行尝试。
【解决方案2】:

连接将返回用户具有多个关联的所有重复行...

例如,如果用户 U1 有一条狗,而用户 U2 有两条狗,则连接将返回总共三行...所以不要使用连接,而是尝试使用包含选项...

请参阅此 Railscast,http://railscasts.com/episodes/181-include-vs-joins 了解更多...

【讨论】:

  • 谢谢,包括完美的作品,但我认为取狗太浪费内存:/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 2010-12-24
  • 2019-06-20
  • 2020-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多