1

Person というモデルがあり、Person には複数の投稿があります。各人の投稿数を照会したい場合、集計を取得するために各人を反復処理し、各投稿を照会する必要があるため、処理に時間がかかります。

class Person < ActiveRecord::Base
has_many :posts
end

出力 (JSON):

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

各 Person のすべての投稿数を最適な方法で計算したいと考えています。最善の解決策は何ですか?

4

2 に答える 2

1

これを行う 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 に答える