这是数据库关系:
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
但是,我想知道是否有任何方法可以通过仅使用一个查询来优化它。
谢谢!
答案 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)