我有以下很好的查询。但是,我想在穿透表上指定replier_fb_group
列removed_on
为空的条件
groups = FbGroup.joins(:replier_accounts).where(
id: group_ids,
:replier_accounts => { active: true }
).group('fb_groups.id'
).having('count(replier_accounts) > 0')
我尝试过的
FbGroup.joins(:replier_fb_groups, :replier_accounts).where(
id: group_ids,
:replier_fb_groups => { removed_on: nil},
:replier_accounts => { active: true }
).group('fb_groups.id'
).having('count(replier_accounts) > 0')
我如何才能在hading子句中做到这一点,您只计算满足其replier_accounts
的条件而replier_fb_group
为零的removed_on
?
答案 0 :(得分:0)
您正在寻找的是通过FbGroup
通过ReplierAccounts
与ReplierFbGroups
连接的一种方法。在这里,我假设ReplierFbGroups
是一个包含ids
和FbGroup
两者中的ReplierAccounts
作为外键的表。 (如果不正确的假设,请告知我。)
为了获取所需的数据,您可能必须编写如下查询:
FbGroup
.joins(replier_fb_groups: : replier_accounts)
.where("replier_accounts.active = true AND replier_fb_groups.removed_on IS NULL")
.group("fb_groups.id")
.having("count(replier_accounts) > 0")
在这里,如果您仔细地注意到联接,我们将join on a nested association用作.joins(replier_fb_groups: : replier_accounts)
,而不是将FbGroups with multiple tables的联接独立地称为.joins(:replier_fb_groups, : replier_accounts)
注意:可以通过使用merge合并来自replier_accounts
和replier_fb_groups
的条件来进一步增强此功能。就像这样:
FbGroup
.joins(replier_fb_groups: : replier_accounts)
.merge(ReplierAccount.active)
.merge(ReplierFbGroup.not_removed)
.group("fb_groups.id")
.having("count(replier_accounts) > 0")
其中ReplierAccount.active
和ReplierFbGroup.not_removed
是各自模型上分别应用活动条件和未移除条件的范围。