[英]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的優點在於,在使代碼讀取速度更快的過程中,無需更改主顯示代碼(添加計數器緩存會使添加/刪除帖子變慢,因此您可能並不想在所有情況下都需要這樣做)。
試試這個五月它會為你工作
#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.