共有2个表:用户和教师。 Teacher.user_id来自用户。那么,如何在单个查询中找到所有不在教师中的用户。
我的意思是:
User.not_in(Teacher.all)
答案 0 :(得分:1)
其他用户似乎忽略了rails 3标签(因为根据批准的答案删除了。我的答案留给后人):请试试这个
User.where("id NOT IN (?)",Teacher.pluck(:user_id).join(","))
这将成为SELECT * FROM users WHERE id NOT IN (....)
(两个查询一个从教师获得user_id
,另一个查询得到user
(s)不在该列表中)并且可能会因大小而失败老师桌。
其他选项是arel表:
users = User.arel_table
User.where(users[:id].not_in(Teacher.select(:user_id).where("user_id IS NOT NULL")))
这应该产生类似于
的单个查询SELECT * FROM users
WHERE id NOT IN ( SELECT user_id FROM teachers WHERE user_id IS NOT NULL)
(一个查询更好的性能)*语法没有经过全面测试
另一个单一查询选项可能是
User.joins("LEFT OUTER JOIN teachers ON teachers.user_id = users.id").
where("teachers.user_id IS NULL")
答案 1 :(得分:0)
我认为你应该可以做这样的事情
User.where.not(id: Teacher.ids)
答案 2 :(得分:0)
您可以使用where.not
中的ActiveRecord
查询尝试以下内容:
User.where.not(id: Teacher.pluck(:user_id).reject {|x| x.nil?})
注意:使用reject
方法,以防某些记录中包含nil值。