美文网首页
n+1问题解决

n+1问题解决

作者: biubiudog | 来源:发表于2018-11-13 14:00 被阅读0次

1.使用gem ‘eager_group’

使用方法:

举例:

select count(*), user_id  from orders where state = "finished" group by user_id

使用:在user.rb中添加

    class User < ActiveRecord::Base

        has_many :orders

        define_eager_group :aaa, :orders, :count, :* , ->{ finished }

        scope :finished ->{where(state:  'finished')}

    end

define_eager_group方法中的参数介绍:

   1.查询方法的引用,生成一个具有相同名称的方法来获取结果
   2.你要关联的表的名称
   3.聚合SQL函数,可以是一个average, count,max,min,sum。
   4.聚合字段名:总的count可以使用:*
   5.可选值, scope 指明查询条件

控制器中调用时:

users = User.all.eager_group(:aaa)
users.each do |user|
  user.aaa
end

2.使用scope解决
order.rb中:

class Order < ApplicationRecord
   scope :with_item_count, -> {
       aggs_sql = Client.group(:owner_id).select("owner_id, count(*) as client_owner_count").to_sql;
       select("order.*, client_owner_count.* ").join("left join (#{aggs_sql})" as aggs_sql  on orders.owner_id = aggs_sql.owner_id)
  }
end

aggs_sql语句

aggs_sql = select owner_id, count(*) as client_owner_count from clients group by owner_id

解释:

  • 先通过owner_id分组查询,查询出每个owner_id对应的client个数。
  • 查询orders,查询orders中的owner_id与clients中的owner_id相等的client_owner_count字段。

使用:

Order.with_item_count.each do |order|
   order.client_owner_count
   order.count
end

参考网页(eager_group

相关文章

网友评论

      本文标题:n+1问题解决

      本文链接:https://www.haomeiwen.com/subject/pylcfqtx.html