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/
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 ?
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.
I've had nothing but problems implementing counter_cache in an ajaxy application. The changes are simply not propagated to the in-memory object as expected.
I have ended up going with a hybrid solution, where I use the counter cache only on pages where the count value cannot change (such as an index of articles with comment counts, explicitly using article.comments_count ). On pages where the count can change, such as an article detail page with a new comment form and an ajaxy updated comments block, I use article.comments.length.
Thanks to this comment: 23. Beate Oct 31, 2007 at 02:34
I could look into my error. The link to Josh Owens' Website is not anymore working.
Here's the simplest solution. The code in the migration *will* work, but before you set ":counter_cache => true" in the model.
That said, I'd love to see the code in this page (and in pastie) updated with the "other solution".
Thanks for your good work Ryan. Cheers.
Here's the Evil Hack that temporarily makes your counter cache attribute non-readonly so that you can initialize it properly during up migration - http://blog.bitfluent.com/post/30194408/updating-counter-cache-in-migrations
You need a buyers agent!! He/she would do all the comps and make sure your offer is appropriate. The biggest problem right now are houses are not appraising out. Be careful make sure the house is not overpriced. If all is well offer 110,000 with 3 back.
I was having trouble getting this to work (on Rails 3). This helped http://millarian.com/programming/ruby-on-rails/rails-counter_cache-problem/
Using the migration (as amended 03/29/08 - blog no longer available) on a large database took a very long time.
Actually, using tasks.count in Rails 2.3 works so:
Project.reset_column_information
Project.find(:all).each do |p|
b.update_attribute :tasks_count, p.tasks.count
end
Is now fine and runs fast enough on a reasonable database size. But make sure this is run before setting counter_cache in the model.
Because once set, tasks_count will become read only and won't update.
I am guessing that Rails was modified so that using count always references the tasks table and to use the cached value you directly read tasks_count. But there seems no reference to this in the API.
But for very large databases, an sql updater to set this column would probably be better.
We are selling all kinds of moncler jackets,moncler coats,moncler vests,moncler shirts and so on,all of our products are at high quality and low price,and they are free shipping.
Thank you. Keep up this great resource. Best greetings.
Interesting railscast. Does it work out of the box with pagination plugins, like will_paginate to?
This is a very good website.
we provides all kinds of christian louboutin shoes and timberland boots.
I generally do not post in Blogs but your weblog forced me to, amazing work.. beautiful.
Here we have new style Coach Handbags.All the Coach purses are good quality and lower price.A fashion Coach Outlet is dreamed by the fashion females.Welcome to our store discountbagshop.com.I am sure you will find one for yourself.
Thanks for writing this. I really feel as though I know so much more about this than I did before. Your blog really brought some things to light that I never would have thought about before reading it. You should continue this, Im sure most people would agree youve got a gift.
All the Coach purses are good quality and lower price.A fashion Coach Outlet is dreamed by the fashion females.Thank you. Keep up this great resource.
It's a variety of saved files from web sites, stored locally on your pc so that the images and other things load faster when returning to a previously visited web site.
very cool article ,like my cool stuff .very useful.thanks for sharing the article!
It's a variety of saved files from web sites, stored locally on your pc so that the images and other things load faster when returning to a previously visited web site.
Thanks for sharing your article. I really enjoyed it. I put a link to my site to here so other people can read it. My readers have about the same interets
I had no idea you could do that, and I learned some things about migrations too.
2010.9.1 ZMF Designer handbag Sale Online: Gucci Bags, Chanel Bags, Choose Your Style.
Very good post. Made me realize I was totally wrong about this issue. I figure that one learns something new everyday. Mrs Right learned her lesson! Nice, informative website by the way.






