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

Kho*_*ham 2 activerecord ruby-on-rails rails-activerecord

这与数据库的关系:

class User < ActiveRecord::Base
  has_many :posts
end

class Post < ActiveRecord::Base
  belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)

我遇到了一种功能,该功能要查询所有尚未发布任何帖子的用户。我知道我们可以用以下方法做到这一点:

users = User.all
users.each do |user|
  unless user.posts.any?
    # do something when user don't have any post.
  end
end
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

fiv*_*git 6

这将导致一个查询,该查询获取所有尚未发布信息的用户:

User.includes(:posts).references(:posts).where('posts.id IS NULL')
Run Code Online (Sandbox Code Playgroud)

另一个解决方案是这样的:

User.where('NOT EXISTS(SELECT 1 FROM posts WHERE user_id = users.id)')
Run Code Online (Sandbox Code Playgroud)

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

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

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

User.without_posts
Run Code Online (Sandbox Code Playgroud)

  • 更像Rails的方式可能是User.includes(:posts).where(posts:{id:nil})。references(:posts)`。这应该解决任何特定于数据库的问题,哈希将在数据库适配器级别处理(我相信)。 (3认同)