2011-07-13 104 views
0

我有兩個型號我可以爲count創建關係嗎?

Post 
    has_many :comments 

Comment 
    belongs_to :post 

當我想要顯示的帖子列表和它的評論數。我通常在這篇文章中加入評論。

Post.find(:all,:include => :comments) 

要顯示帖子的評論數量。

post.comments.size 

我可以創建一個has_many關係返回註釋數嗎?

has_one :comments_count 

我可以像這樣包含這種關係嗎?

Post.find(:all,:include => :comments_count) 

回答

4

Rails有一個計數器緩存會自動更新,根據列值相關項目的數量。這將允許您在返回帖子對象時包含計數。只需將它添加到belongs_to的評論。

Comment 
    belongs_to :post, :counter_cache => true 

你需要添加一個新的整數列的職位爲計數器:

class AddCounterCacheToPosts < ActiveRecord::Migration 
    def self.up 
    add_column :posts, :comments_count, :integer 
    end 
end 
3

要回答你的問題,是的,你可以;但這不是最有效的方法。通常情況下,您將一列添加到Post,名爲comments_count,並且您每增加一行Comment CRUD操作即可更新該列。

添加列:

rails g migration add_comment_count_to_post 

然後在遷移中添加以下行:

add_column :posts, :comments_count, :integer, :default => 0 

再就是從這裏處理它雙向的。

第一個是定製before_savebefore_destroyComment模型。

app/models/comment.rb

class Comment << ActiveRecord::Base 

    belongs_to :post 

    before_save :update_comments_count 
    before_destroy :update_comments_count 

    def update_comment_count 
     post.update_attribute(:comment_count, post.comments.count) 
    end 

end 

第二種方法是使用這個Rails的定製幫手:

app/models/comment.rb

class Comment << ActiveRecord::Base 

    belongs_to :post, :counter_cache => true 

end 
相關問題