查找在Rails中没有帖子的用户

时间:2014-09-12 16:54:22

标签: ruby-on-rails activerecord rails-activerecord

这是数据库关系:

class User < ActiveRecord::Base
  has_many :posts
end

class Post < ActiveRecord::Base
  belongs_to :user
end

我遇到了一个功能,我想查询所有尚未发布帖子的用户。我知道我们可以这样做:

users = User.all
users.each do |user|
  unless user.posts.any?
    # do something when user don't have any post.
  end
end

但是,我想知道是否有任何方法可以通过仅使用一个查询来优化它。

谢谢!

3 个答案:

答案 0 :(得分:6)

这会导致单个查询获取尚未发布帖子的所有用户:

User.includes(:posts).references(:posts).where('posts.id IS NULL')

另一种解决方案是:

User.where('NOT EXISTS(SELECT 1 FROM posts WHERE user_id = users.id)')

由于这是一个在任何地方使用的相当复杂的查询,您可以将其放在User中的命名范围内:

class User < ActiveRecord::Base
  scope :without_posts, -> { where('NOT EXISTS(SELECT 1 FROM posts WHERE user_id = users.id)') }
end

现在,您可以在应用程序的其他位置使用此范围:

User.without_posts

答案 1 :(得分:0)

我尝试像

这样的东西
User.joins(posts).where("count(posts.id) = 0")

返回所有有0个帖子的用户。

答案 2 :(得分:0)

使用 rails 6.1,甚至更简单:

User.where.missing(:posts)