计数小于关联的ActiveRecord条件

时间:2012-11-28 19:01:14

标签: sql ruby-on-rails ruby activerecord

我有一个User has_many messages。 我需要创建一个

的查询

'Get me all users who's (message.opened == false) count < 3'

现在,我正在使用User.all,遍历所有用户,并手动计数。我知道这不是很有效,它可以在一个查询中完成,但我是SQL / ActiveRecord的新手,所以需要一些帮助。 感谢

4 个答案:

答案 0 :(得分:0)

试试这个

User.includes(:messages).group('users.id').having('SUM(IFNULL(messages.opened = 0, 1)) < 3')

至少在MySQL上运行, AND ,假设您的布尔值true在数据库中为1。

编辑我已经改变了条件

如果IFNULL可以messages.opened

,则

PS NULL可以处理

答案 1 :(得分:0)

假设Rails 3语法。你可以这样做:

User.joins(:messages).where(:messages => {:opened => false}).group(:user_id).having("COUNT(messages.id) < 3)

答案 2 :(得分:0)

这应该有效:

User.includes(:messages).group("users.id").where("messages.opened = 0").having("count(messages.id) < 3")

这将创建两个查询,一个用于分组查询,另一个用于通过连接急切加载生成的用户和消息。

答案 3 :(得分:0)

这是您的问题的解决方案

User.includes(:messages).group("users.id").where("messages.opened = 0").having("count(messages.id) < 3")

但您还可以做的是为此

创建一个范围
scope :not_opened_less_three_count, includes(:messages).group("users.id").where("messages.opened = 0").having("count(messages.id) < 3")

然后您可以在任何需要的地方使用它,如下所示

User.not_opened_less_three_count