This is interesting. I probably never would have done this think it was redundant data. Thanks once again.
Another great screencast!
Ideas:
1) Setting up a Rails project using SVN (only a little off topic)
2) Deploying a Rails project using Capistrano
Keep it up Ryan!
Great stuff -- I had no idea you could do that, and I learned some things about migrations too.
Thank you!
I would like to see acts_as_nested_set tutorial sometime. I'm currently doing an acts_as_nested_set with a self-referential, and it's not going too smooth. Love the screencasts - keep it up!
I love the screencasts and the site! It has become first thing I check during my daily reading session. :)
I'm alse currently interested in act_as_nested_set - like ryan.
@David Parker: Railscasts’ sponsor, PeepCode, has a detailed screencast tutorial on Capistrano (with a free update to the version 2 screencast when that comes out):
http://www.peepcode.com/products/capistrano-concepts
Thanks Grant!... didn't check out that one yet. I ordered the RESTful one and I love it. I'll definitely look into it.
Thanks for the screencasts. They're great.
I am wondering why this approach is better than simply using length instead of size?
I never got this to work. I can see in the console, that the tasks_count has value when adding new tasks, but when finding all projects (with tasks) using project.tasks.size -method, I still see the "SELECT count(*) AS count_all FROM..." with as many ids as the projects. I have the counter_cache => true value in model. This is strange? (Is this only working in production -state?)
@jaffet, not sure what the problem is. It should work in development mode which is the mode I was in for this screencast. What version of Rails are you using?
This is not working with the has_and_belongs_to_many relation.
If there are something like:
class Post < ActiveRecord::Base
has_and_belongs_to_many :tags, :counter_cache => true
end
will get an "ArgumentError" error:
Unknown key(s): counter_cache
how to resolve this situation?
@RainChen, I don't think Rails provides an easy way to do this with the has_and_belongs_to_many association. You may want to consider using has_many :through instead.
Alternatively you can try building your own custom counter cache by using the after_add and after_remove callbacks.
I trying the "after_add and after_remove" way.But I met a problem.
I can successfully update the counter cache when adding or destroying the associated record.But how about the updating?
Any tips,thx?
@taco: #length does an SQL query with AR, while #size uses the version in memory and therefore the cached number
Is it possible to maintain counters of complete and incomplete tasks?
Basically I need counters for each state in my child model, and this approach works for counting # of children right?
Thanks
@Andy, I think you'll need to keep track of this manually instead of using the counter_cache option. You'll have to set up an observer or callback to update the counter cache every time you change a task. You may want to ask this on railsforum.com where I can go into more detail.
Hi. Another great screencast! Thank you very much!
I'd like to do like a couple of other viewers and announce my interest in a cast about act_as_nested_set.
Thanks again...
I think it's not possible any more in rails edge (2.0) to fill the count-colums afterwards, because (from the edge api):
"Note: Specifying a counter_cache will add it to that model’s list of readonly attributes using attr_readonly."
Some other idea for this?
Beate,
I recently posted about this very issue on my blog. I ran into the same problem about a week ago.
Check it out:http://josh.the-owens.com/archives/2007/11/03/rails-edge-change-how-to-add-a-counter-cache-to-an-existing-db-table/
"Counter Cache migration article":http://josh.the-owens.com/archives/2007/11/03/rails-edge-change-how-to-add-a-counter-cache-to-an-existing-db-table/
Since knowledge of our ideas is a posteriori, the paralogisms of human reason, consequently, are by their very nature contradictory.
I would also like to see a railscast on acts_as_nested_set (maybe even combined with some drag and drop sorting!)
Interesting railscast. Does it work out of the box with pagination plugins, like will_paginate ?
Thanks for the updated post.
It works great for edge rails so far.
How to add counter_cache if I have has_many_polymorphs?
For example:
I have model Topic and Articles:
in Topic
has_many_polymorphs :affiliateds,
:from => [:topics, :articles],
:through => :affiliations,
:dependent => :destroy,
:as => :affiliate
How to add topics_count, articles_count?
Thanks for the information about how to add a counter cache to an existing db
However I found that solution a little bit to complex for me. I migrate tables where some inital row values in the db are generated using Model.create in the migration class, which cannot be done with counter caching.
Instead I just made a rake file with the same Model.create calls and that seems to work, if I just generate the values in a correct order.
Any comments on that solution?
Thanks for the great tips Ryan. I originally saw this RailsCast a while back, but came back to it today for some info. I just want to say again that you are an amazing part of the Rails community.
Ryan, do you have any experience or advice on working with counter_caches that also have conditions on them?
For instance, what is the best way, or a very good way to go about handling a situation where you want to count only unread messages and also count the total number of messages with a counter_cache? for the total number of messages it's easy. but the unread have some conditions that would obviously need to be checked.





