在 ruby rails 中,有没有一种方法可以获取 where 方法范围之外的对象?

In ruby rails, is there a method to get the objects outside of a where method's scope?

提问人:Bax STAR 提问时间:7/20/2023 更新时间:7/21/2023 访问量:53

问:

对于上下文,基本上我试图找出哪些用户没有特定的帖子,例如:

@specified = User.joins(:post).where(post: {content: "Goodbye!"})

与我想要得到的(基本上只是不包括在内的每个用户)

!@specified

我试着否定它,但它不起作用,有没有解决方案?

Ruby-on-Rails 宝石 Ruby-on-Rails-4

评论

1赞 crodev 7/20/2023
您可以添加 .前任。.not@specified = User.joins(:post).where.not(post: {content: "Goodbye!"})
0赞 Bax STAR 7/20/2023
@crodev,我刚才刚刚尝试过,但显然它仍然没有得到我想要的所有用户,但我认为这可能是因为这些用户甚至还没有任何帖子,所以我猜 .not 不包括 null/nil?
2赞 Stefan 7/20/2023
内部联接仅返回具有关联的记录。如果您对所有记录感兴趣(具有特定类型帖子的用户和没有任何帖子的用户),则需要外部联接。(联接表的文档涵盖了这两种变体)

答:

1赞 Alex 7/21/2023 #1

如果用户有多个帖子,这将为您提供重复的用户,并跳过没有帖子的用户:

User.joins(:post) # should it be :posts?

你找到了你不想要的东西:

User.joins(:post).where(post: {content: "Goodbye!"})

not只过滤掉有“再见!”的帖子,如果用户有其他帖子,则该用户将被包含在结果中:

User.joins(:post).where.not(post: {content: "Goodbye!"})

简单的出路是否定整个事情:

User.where.not(
  id: User.joins(:post).where(post: {content: "Goodbye!"})
)

评论

0赞 Bax STAR 7/21/2023
这就是我一直在寻找的,它工作得很好!谢谢!