0

投稿オブジェクトとコメントオブジェクトを処理するRailsアプリがあるとします。投稿has_manyコメントと各コメントbelongs_to投稿。

各コメントにはword_countプロパティがあります。Postオブジェクトには、average_comment_word_count各コメントの平均であるプロパティがありますword_count

最初の質問は、Postオブジェクトが非同期的に変更される場合(平均単語数に影響するコメントが追加される場合)、どの時点でプロパティを再計算する必要がありますか?オブジェクトが返されるとき?または、新しいコメントが追加されるたびに?コメントや投稿ヘルパーのメソッドに入りますか?どのコントローラー関数がこのメソッドを呼び出す必要がありますか?

また、次の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
4

2 に答える 2

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

または、トラフィックの少ない場所で1回だけ使用した場合は、デメテルの法則を大胆に無視し、必要に応じて投稿オブジェクトから計算します。

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

更新:@corewardが指摘しているように、この回答の最初の部分は非同期更新には役立ちませんが、残りの回答は引き続き役立つ場合があります。

于 2012-04-16T20:38:34.197 に答える
1

単語の総数を追跡するActiveModelにすでにあるものに基づいてカスタムカウンターキャッシュを構築し、コメントをカウントして手動で計算する方がはるかに良いでしょう。

# you need a comments_count column and a words_count column in this table
class Post < ActiveRecord::Base
  has_many :comments

  def avg_words_per_comment
    words_count / comments_count
  end
end

class Comment < ActiveRecord::Base
  belongs_to :post, :counter_cache => true
  after_save { update_counters(post.id, :words => word_count }
  before_destroy { update_counters(post.id, :words => -word_count }
end

# And in your view:

<p> 
  The average comment for this post has <%= @post.avg_words_per_comment %> words.
</p>

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

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

于 2012-04-16T21:11:41.367 に答える