找到协会中的所有内容

所以我有一个post和一个用户。
发布has_many用户,用户发布post。
我需要一个查找,找到所有没有任何用户的post,如下所示:

Post.first.users => [] 

 Post.where("id not in (select post_id from users)") 

今天就学到了这个:

 Post.eager_load(:users).merge(User.where(id: nil)) 

至少可以使用Rails 4+。

更新:

在Rails 5+中,您可以使用left_joins

 Post.left_joins(:users).merge(User.where(id: nil)) 

类似的东西:

 p = Post.arel_table u = User.arel_table posts = Post.find_by_sql(p.join(u).on(p[:user_id].eq(u[:p_id])).where(u[:id].eq(nil)).to_sql) 

如果您需要快速的东西,请使用以下SQL语句:

 SELECT * FROM posts p LEFT OUTER JOIN users u ON p.id = u.post_id WHERE u.id IS null 

我想如果数据库表有很多行,带有in的sql会导致性能问题。 小心一点

我知道这被标记为Rails 3,但是如果你使用的是Rails 4,我一直这样做。

 Post.where.not(user_id: User.pluck(:id)) 

Post.first.users.empty? 用户返回数组应该足够了。

如果你想检查你可以做的每个post

 Post.each do |p| if p.users.empty? do whatever end end