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 )
网友评论