如何使用Mongoid查询拥有关联Device的Employee文档?
正确查询拥有关联Device的Employee的方法
针对你定义的Rails模型:
class Employee has_one :device end class Device belongs_to :employee end
下面是几种正确的实现方式,按推荐度排序:
1. 使用内连接(推荐)
用joins做内连接是ActiveRecord中最直接高效的方式,内连接会自动筛选出拥有对应Device的Employee:
Employee.joins(:device)
这个写法会生成INNER JOIN "devices" ON "devices"."employee_id" = "employees"."id"的SQL,只返回有关联Device的员工记录。
2. 使用exists子查询
如果需要更明确的语义,也可以用exists语法:
Employee.where.exists(:device)
这会生成WHERE EXISTS (SELECT 1 FROM "devices" WHERE "devices"."employee_id" = "employees"."id")的SQL,性能和内连接相当,语义更清晰。
3. 你的第四种写法(可运行但不推荐)
你尝试的Employee.includes(:device).where("devices.id is not null")虽然能得到结果,但includes的核心作用是预加载关联避免N+1查询,用它来筛选属于误用,会额外加载所有关联的Device数据,造成不必要的性能开销,所以不推荐。
至于你前三种写法::'device'.exists => true、:'device.id'.ne => nil、:'device.device_uuid'.ne => nil,这些是MongoDB查询语法(比如Mongoid框架),并不适用于ActiveRecord(Rails默认的关系型数据库ORM),所以在你的场景下是无效的。
内容的提问来源于stack exchange,提问作者Mattix
相关产品推荐
相关产品推荐

