所以假设我们有一个用户模型,它有很多项目
如何找到没有项目的用户?
一个非常低效的方法是这样做:
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
有更好的方法吗?
使用左外部联接,其中联接表id为空:
User.left_joins(:projects)
.where(projects: { id: nil })
left_outer_joins
又称left_joins
是在Rails5中引入的。对于Rails4,您需要使用一个变通方法:
User.joins("LEFT OUTER JOINS projects ON projects.user_id = users.id")
.where(projects: { id: nil })
这是我脑海中的一个快速解决方案,希望它能有所帮助。
User.joins('left outer join projects where projects.user_id = users.id').where('projects.id is null')
对于轨道5,您可以使用left_joins
User.left_joins(:projects).where('projects.user_id is null')