Ruby on rails Rails将嵌套表与条件连接起来,并防止N+;1查询

Ruby on rails Rails将嵌套表与条件连接起来,并防止N+;1查询,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,这些模型只是User和Review。关系:用户有许多评论。我想查询出哪个用户有超过2条评论 这是我写的,而且很有效 User.joins(:reviews).group(:id).having("COUNT('reviews.id') > 2") 然后我想包装它们,并返回用户的id,名字和评论的标题。因此,我尝试了以下方法,但抛出了一个N+1查询问题 User.select(:id,:first_name) .joins(:reviews).group(:id) .hav

这些模型只是
User
Review
。关系:
用户
有许多
评论
。我想查询出哪个用户有超过2条评论

这是我写的,而且很有效

User.joins(:reviews).group(:id).having("COUNT('reviews.id') > 2")
然后我想包装它们,并返回用户的
id
名字
和评论的
标题
。因此,我尝试了以下方法,但抛出了一个N+1查询问题

User.select(:id,:first_name)
    .joins(:reviews).group(:id)
    .having("COUNT('reviews.id') > 2")
    .as_json(include: {reviews: {only: :title}})
只需将
连接
包含
似乎不起作用,有没有办法解决
具有
条件的急切加载问题?

尝试以下方法:

User.select(:id, :first_name).left_joins(: reviews).includes(: reviews).group(:id).having("COUNT('reviews.id') > 2")

它适用于我,但是,我不知道什么是
。作为{u json(包括:{items:{only::title}}})
,如果它适用于
。作为{u json(包括:{items:{only::title}})
,很抱歉,这是错误的模型名称。它是json(包括:{
reviews
。},而不是
,因此基本上,如果我想使用带
联接的渴望加载
,我需要添加
左联接
?你能解释一下为什么只有
包含
不起作用吗?嗨@CodaChang我对SQL不是很熟悉,在我的理解中,联接使用内部联接,在你的情况下,左外部联接会更好。你可以使用joins,但查询将是
User.select(:id,:first\u name)。join(:reviews)。includes(:reviews)。group(:id)。having(“COUNT(*)>2”)
。仅包括不起作用,我的理解是,在使用having.ref时应该使用join