我有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语句)加载父对象的所有子对象?
如何使Parent.includes(:kids).find_by(kids: { name: 'Bobby' }
成为子查询
Parent.includes(:kids).where(id: Parent.includes(:kids).find_by(kids: { name: 'Bobby' })
您想要INNER JOIN
:
parents = Parent.joins(:kids).where(kids: { name: 'Bobby' })
[这将仅包括来自孩子表中具有匹配项的父母的行。您可以将其用作子查询,以避免删除其余的联接行:
parents = Parent.where(
id: Parent.joins(:kids).where(kids: { name: 'Bobby' })
).includes(:kids)