ruby on rails 减少查询次数

有时间写代码比较粗糙,不管代码质量,这样会造成查询次数过多的情况
下面几个方法可尽量避免

1 使用includes 方法及早加载
Active Record 允许我们提前指明需要加载的所有关联,这是通过在调用 Model.find 时指明 includes 方法实现的。通过指明 includes 方法,Active Record 会使用尽可能少的查询来加载所有已指明的关联

假设有如下代码,查找 10 条客户记录并打印这些客户的邮编:
categorys = Category.limit(10)
 
categorys.each do|category|
  puts category.articles.first.title
end

上面的代码第一眼看起来不错,但实际上存在查询总次数较高的问题。这段代码总共需要执行 1(查找 10 条客户记录)+ 10(每条客户记录都需要加载地址)= 11 次查询


使用incluses之后

categorys = Category.limit(10)
 
categorys.each do|category|
  puts category.articles.first.title
end

上面的代码只执行 2 次查询,而不是之前的 11 次查询:

SELECT*FROMcategorys LIMIT 10
SELECT articles.* FROM articles WHERE(articles.category_id IN(1,2,3,4,5,6,7,8,9,10))
 
 


***注意:includes(:articles) 关联要在model里 写好关系。

 
 
classArticle < ApplicationRecord belongs_to:category has_many:comments has_many:tags end classCategory < ApplicationRecord has_many:articles end


2 有时候页面需要计算 总数量这些数值

比如shop.shop_users.count

会进行  查询

SELECT COUNT(*) FROM `shop_users` WHERE `shop_users`.`shop_id` = 11

为避免 应使用size或者length  方法

3 查询  所有的然后使用group_by 这样可以直接取,不用像group  方法查询出来的数据似得需要遍历匹配

@shoporder_group = ShopOrder.all.group_by{|shoporder| shoporder.shop_id }

遍历数据的时候使用

@shoporder_group[shop.id].nil? ? 0 : @shoporder_group[shop.id].count













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值