簡體   English   中英

Rails相關模型聚合的性能改進

[英]Performance improvement for Rails associated model aggregation

我有一個名為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 計數器緩存機制來跟蹤Person對象上每種類型的計數。

Rails的優點在於,在使代碼讀取速度更快的過程中,無需更改主顯示代碼(添加計數器緩存會使添加/刪除帖子變慢,因此您可能並不想在所有情況下都需要這樣做)。

  1. 編寫初始代碼
  2. 使用急切的加載使其更快
  3. 使用計數器緩存使其更快

試試這個五月它會為你工作

    #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,它還會給出類型,然后根據類型檢查計數。 因為我不知道帖子模型中的哪個字段。 所以檢查一下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM