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)
但是,我想知道是否有任何方法可以只使用一个查询来优化它。
谢谢!
这将导致一个查询,该查询获取所有尚未发布信息的用户:
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)
| 归档时间: |
|
| 查看次数: |
911 次 |
| 最近记录: |