1

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

class Person < ActiveRecord::Base
has_many :posts
end

输出(JSON):

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

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

4

2 回答 2

1

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

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计数器缓存机制来跟踪 Person 对象上每种类型的计数。

Rails 的美妙之处在于,在使代码读取速度更快的过程中,您的主要显示代码不需要更改(添加计数器缓存会使添加/删除帖子的速度变慢,因此您可能不希望在所有情况下都这样做)。

  1. 编写初始代码
  2. 使用急切加载使其更快
  3. 使用计数器缓存使其更快
于 2012-12-23T18:52:31.070 回答
0

试试这个五月它会为你工作

    #In Controller
    @persons = Person.all
    #In View
    @persons.each do |person|
         person.posts.count # It will gives all posts count
         person.posts.collect{|x| true if x.type==1 }.compact.count #If you want to get the post counts based on type
    end

假设如果您想获取任何方法,只需在控制台中检查或调试是 person.methods.sort 它将提供所有方法。
尝试在 rails 控制台 person.posts.methods 也会给出类型,然后根据类型检查计数。因为我不知道帖子模型中有哪些字段。所以检查一下。

于 2012-12-18T05:40:56.637 回答