检索其他表中未引用的记录,ActiveRecord查询

时间:2016-08-01 17:46:19

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

共有2个表:用户和教师。 Teacher.user_id来自用户。那么,如何在单个查询中找到所有不在教师中的用户。

我的意思是:

         User.not_in(Teacher.all)

3 个答案:

答案 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值。