2012-04-16 5 views
0

投稿とコメントオブジェクトを扱うRailsアプリケーションがあるとします。 A投稿has_manyコメントと各コメントbelongs_to投稿。レールヘルパーとコントローラメソッドを利用する

各コメントにはword_count性質を持っています。投稿オブジェクトには、コメントのword_countのそれぞれの平均であるaverage_comment_word_countプロパティがあります。 Postオブジェクトは、非同期的に(コメントは平均単語数に影響を与える追加されます)に変更されます場合

最初の質問は、どの時点で、私はプロパティを再計算する必要があり、ありますか?オブジェクトが返されたら?または、新しいコメントが追加されるたびに?コメントや投稿ヘルパーメソッドに入りますか?どのコントローラ関数がこのメソッドを呼び出すべきですか?私は次のポストヘルパーメソッドが含まれている場合

はまた、私はJSONとして返さNULL値を取得します。

def average_word_count 
    @average_word_count = 0 
    # current_user returns the current user object 
    # user has_many posts and each post belongs_to a user 
    current_user.posts.find(params[:id]).comments.each do |comment| 
     @average_word_count += comment.word_count/current_user.posts.find(params[:id]).comments.count 
    end 

    @average_word_count 
end 

答えて

2
class Comment < ActiveRecord::Base 
    belongs_to :post 

    after_save :update_post_word_count 

    def update_post_word_count 
    average_wc = post.comments.average(:word_count) 
    post.update_attributes average_comment_word_count: average_wc 
    end  
end 

それとも、あなたがそれを必要とする場合にのみ、それを導き出す:

class Post < ActiveRecord::Base 
    has_many :comments 

    def average_comment_word_count 
    comments.average :word_count 
    end 
end 

それとも、それはどこかの低いトラフィックが一度使われている場合は、厚かましくデメテルの法則を軽視し、同じようにそれを計算

Average Comment Word Count: <%= @post.comments.average :word_count %> 

アップデート:郵便物から必要な@corewardノートとして、この答えの最初の部分はasynchronoのために有用ではありません私たちは更新しますが、残りの答えは依然として役に立つかもしれません。

+0

これは、*追加のクエリの多くを行い、*それは、非同期クエリを説明するために失敗しました。 – coreyward

+0

@coreyward、非同期クエリの良い点ですが、追加のクエリは表示されません。各post.comments.average(:foo)は、単一のSQL文を作成します。 – Mori

+0

私はこのアプローチを顧客カウンターキャッシュよりも実装しやすく(そしてより一般的です)、それが受け入れられたとマークしている理由です。 –

1

あなたは言葉だけの合計数を追跡しActiveModelですでに何に基づいてカスタムカウンタのキャッシュを構築するオフにたくさんの方が良いだろう、そしてちょうど手動で計算を行うために、コメントを数えます。

次に、非同期性について心配する必要はなく、表示の計算は最小限に抑えられます。

https://github.com/rails/rails/blob/master/activerecord/lib/active_record/counter_cache.rb#L65

+0

私はRailsのビューテンプレートを使用していません。代わりにJSONレスポンスを送信しています。それはあなたの答えについては、ビューの部分以外に何かを変えますか? –

+0

また、数値オブジェクトプロパティの数学演算を行うことについて私の頭を抱かせようとしています。単語を数えることは、IMOの素晴らしいソリューションですが、一般的なケースではありません。回答ありがとう:) –

+0

@AndrewBarinov私は文字通りすべての仕事をしました。ちょうどHTMLの代わりにJSONのパラメータを出力します(JSONはビュー、btwです)。私はあなたが "数値的オブジェクトのプロパティに関する数学的操作"について何を行っているのか分かりません。あなたはあなたの投稿に応じてCommentに 'word_count'メソッドを既に持っています。' post#words_count'と 'post#comments_count'は両方ともデータベースの数値カラムのアクセサです。 – coreyward

関連する問題