gpt4 book ai didi

mysql - Rails 关联模型聚合的性能改进

转载 作者:行者123 更新时间:2023-11-29 00:36:46 24 4
gpt4 key购买 nike

我有一个名为 Person 的模型,Person 有多个帖子。当我想查询每个人的帖子数时,需要很长时间才能处理,因为它需要遍历每个人并查询每个帖子以获得聚合。

class Person < ActiveRecord::Base
has_many :posts
end

输出(JSON):

Person1
PostsType1Count: 15
PostsType2Count: 45
Person2
PostsType3Count: 33
.
.
.

我想以最佳方式计算每个人的所有帖子数。什么是最佳解决方案?

最佳答案

如果您有一组小型的预定义类型,这是执行此操作的一种方法

class Person < ActiveRecord::Base
has_many :type_1_posts, :class_name => 'Post', :conditions => 'post_type = 1'
has_many :type_2_posts, :class_name => 'Post', :conditions => 'post_type = 2'
has_many :type_3_posts, :class_name => 'Post', :conditions => 'post_type = 3'
end

然后您可以编写如下所示的代码来获取所有数据:

@all_people = Person.includes(:type_1_posts, :type_2_posts, :type_3_posts).all

帖子的预先加载允许每种类型的帖子计数可用,以及每种类型的所有帖子。

如果您需要此代码的额外性能,因为您经常执行此查询,那么您可以考虑使用 Rails counter cache 机制来跟踪 Person 上每种类型的计数对象。

Rails 的美妙之处在于,在这个使代码阅读速度更快的过程中,您的主要显示代码不需要更改(添加计数器缓存会使添加/删除帖子变慢,因此您可能根本不需要它个案)。

  1. 编写初始代码
  2. 使用预先加载使其更快
  3. 使用计数器缓存使其更快

关于mysql - Rails 关联模型聚合的性能改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13926739/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com