How to implement a Counter Cache in Rails?
- by yuval
I have a posts controller and a comments controller.
Post has many comments, and comments belong to Post.
The associate is set up with the counter_cache option turned on as such:
#Inside post.rb
has_many :comments
#Inside comment.rb
belongs_to :post, :counter_cache => true
I have a comments_count column in my posts table that is defaulted to zero, as such:
add_column :posts, :comments_count, :integer, :default => 0
In the create action of my comments controller, I have the following code:
def create
@posts = Post.find(params[:post_id])
@comment = @post.comments.build(params[:comment])
if @comment.save
redirect_to root
else
render :action => 'new'
end
end
My problem: when @comment.save is called, I get the following error:
ArgumentError in CommentsController#create
wrong number of arguments (2 for 0)
Removing :counter_cache => true from comment.rb completely solves the problem, so I'm assuming that it is the cause of this vague error. What am I missing here?
How can I save my comment and still have rails take care of my counter_cache for my post?
Thanks!