首页 > 解决方案 > 如何找到一个没有很多的 Activerecord 条目

问题描述

假设我们有一个用户模型,它有很多项目

如何找到没有项目的用户?

一种非常低效的方法是这样做:

all_projects_with_users = Project.all.pluck(:user_id).uniq
all_users = User.all.pluck(:id)
users_without_projects = all_users - all_projects_with_users

有一个更好的方法吗?

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

解决方案


使用左外连接并且连接表 id 为空:

User.left_joins(:projects)
    .where(projects: { id: nil })

left_outer_joinsakaleft_joins是在 Rails 5 中引入的。对于 Rails 4,您需要使用一种解决方法:

User.joins("LEFT OUTER JOINS projects ON projects.user_id = users.id")
    .where(projects: { id: nil })

推荐阅读