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