Rails中的includes和joins的区别与用法(翻译,部分)

includes和joins的不同
当includes和joins的时候最重要的概念就是他们有他们的典型用例。
includes使用贪婪加载(eager loading)而joins使用懒加载(lazy loading),两者都非常有用,但是也都很容易被滥用导致程序性能降低或过度使用。
如果我们看一眼ruby on rails文档,描述includes最重要的一句话是:

使用includes,Active Record确保使用最少的查询加载所有指定的连接。

换句话说,当我们的查询需要一个关联表时,两者(我们要查的表和关联表)都会被加载到内存中,这反过来在检索关联数据时会减少查询的次数。下边例子中我们检索companies表中所有关联person表的记录。

@companies = Company.includes(:persons).where(:persons => { active: true } ).all

@companies.each do |company|
     company.person.name
end

当我们迭代每个companies表中记录并且显示其对应person名字时,通常情况下,我们不得不每次使用单独的查询来检索person的名字。然而当我们使用includes方法时,渴望加载会把这关联的两个表加载到内存,所以这些代码只需要以此查询。很棒,对吧?
所以当我们想检索所有关联person的companies数据,但是不想显示Person表中数据的时候,使用includes会发生什么呢?这时候加载关联的表就没有必要了,这时joins就开始闪光了!

@companies = Company.joins(:persons).where(:persons => { active: true } ).all


@companies.each do |company| 
     company.name 
end

joins方法使用懒加载(lazy loading)方式加载数据库,它只把Company表加载到内存,与Company表关联的Person表并不做要求(不加载到内存)。因此我们呢不会将冗余数据加载到内存中,虽然如果以后我们需要从同一数组变量使用Person表的数据,需要进一步的数据查询。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值