2013-01-20 62 views
0

@teachers = User.joins(:students).where("student_id IS NOT NULL")Rails查询]加入之间的区别

上面的工作,下面没有。

@teachers = User.includes(:students).where("student_id IS NOT NULL")

据我了解,连接和包括应既带来不同的性能相同的结果。根据this,您使用includes加载由Model调用的对象的关联记录,其中joins只需将两个表一起添加。使用includes也可以防止N+1 queries

第一个问题:为什么我的第二行代码不工作?

第二个问题:任何人都应该在类似于上面的情况下总是使用includes

+0

你是什么意思不起作用? –

+3

检查了这一点:http://railscasts.com/episodes/181-include-vs-joins – Nobita

回答

0

当您想要针对连接的模型进行查询时使用连接。这是在你的表之间进行内部连接。

包括是当你想要加载相关模型到最终结果。
这使您可以在任何结果上调用关联,而无需再次执行数据库查找。 您无法查询通过包含加载的模型。如果你想查询它,你必须使用连接(你可以做到这一点!)

+0

感谢您的关于不能够查询一个只包括项目。 –

+0

现在还不完全正确,现在可以在连接查询中运行条件:http://guides.rubyonrails.org/active_record_querying.html#specifying-conditions-on-eager-loaded-associations –

+0

这是不正确的,你当然可以做再次查询使用“引用”加载的模型。 – weexpectedTHIS