ActiveRecord #includes,带有条件,但加载所有关系,而不仅是那些匹配条件

问题描述 投票:3回答:2

我有ActiveRecord模型Parent和Kid。父母有很多孩子。

我有一个父母叫爸爸,有3个孩子,名字叫亚伯,鲍比和该隐。我想根据仅一个孩子的名字来查找“父母”。

parent = Parent.includes(:kids).
  find_by(kids: { name: 'Bobby' })

上面的查询为我提供了我想要的父母,但是parent.kids仅包括Bobby。我也希望Abel和Cain也包括在parent.kids中,就像我这样做一样:

Parent.find_by(name: 'Dad').kids

我可以做:

Parent.includes(:kids).
  find_by(kids: { name: 'Bobby' }).
  tap { |parent| parent&.kids.reload }

但是没有一种“更好”的方式来获取其余孩子吗?例如,有一种方法可以在查询父对象时(通过一个SQL语句)加载父对象的所有子对象?

ruby-on-rails ruby join activerecord relation
2个回答
1
投票

如何使Parent.includes(:kids).find_by(kids: { name: 'Bobby' }成为子查询

Parent.includes(:kids).where(id: Parent.includes(:kids).find_by(kids: { name: 'Bobby' })

0
投票

您想要INNER JOIN

parents = Parent.joins(:kids).where(kids: { name: 'Bobby' })

[这将仅包括来自孩子表中具有匹配项的父母的行。您可以将其用作子查询,以避免删除其余的联接行:

parents = Parent.where(
            id: Parent.joins(:kids).where(kids: { name: 'Bobby' })
          ).includes(:kids)
© www.soinside.com 2019 - 2024. All rights reserved.