我有一个User
has_many
messages
。
我需要创建一个
'Get me all users who's (message.opened == false) count < 3'
现在,我正在使用User.all
,遍历所有用户,并手动计数。我知道这不是很有效,它可以在一个查询中完成,但我是SQL / ActiveRecord的新手,所以需要一些帮助。
感谢
答案 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