Rails加入并按主要模型ID进行过滤

时间:2019-03-01 14:20:50

标签: ruby-on-rails postgresql activerecord

这两个查询为什么产生不同的结果?

FbGroup.where('fb_groups.id IN (?)', ids).length
> 300

FbGroup.joins(:fb_posts).where('fb_groups.id IN (?)', ids).length
> 500

我想要的结果是加入fb_posts,但是在加入之前,我想用特定的ID过滤fb_groups。我该怎么办?

3 个答案:

答案 0 :(得分:0)

  

为什么这两个查询产生不同的结果?

联接可能会导致1:N(一对多)记录。例如。如果一个FbGroup有两个FbPost,则您加入时将获得两条记录。

  

我想要的结果是加入fb_posts,但是在加入之前,我想按特定的ID过滤fb_groups。我该怎么办?

您的第二个查询已执行此操作。当您使用联接进行过滤或联接,然后在外部查询中进行过滤时,您仍将获得相同的结果。

答案 1 :(得分:0)

  

我想要的结果是加入fb_posts,但是在加入之前,我想用特定的ID过滤fb_groups。我该怎么办?

我仅将fb_groupsid 123一起使用

FbGroup.where(id: [1, 2, 3]).joins(:fb_posts).count

答案 2 :(得分:0)

我认为它是在联接中复制记录。您应将group_by与联接一起使用以消除它。试试

FbGroup.joins(:fb_posts).where('fb_groups.id IN (?)', ids).group('fb_groups.id').length

如果我错了,请纠正。