好比je的博客分类与博客,分类后面标注了当前分类下的文章数量,这个在ror中很容易就联想到通过counter_cache来实现,完美的让人瞠目结舌。
在父表加个字段blogs_count,子表model中的belongs_to中加上【:counter_cache => true】声明即可了,剩下的rails统统帮你自动搞定。
使用之后,发现在创建博客、删除博客时,分类中的blogs_count字段可以自动实现+1、-1。然后,不幸的是在变更博客的分类时,blogs_count字段没法实现自动±1,这是怎么回事呢,马上google一通,发现BelongsToAssociation类曾在05年被人弄过,没弄之前确实不支持更新时自动维护count字段,对照弄过后的BelongsToAssociation类与现在rails 2.3.2中的BelongsToAssociation类,发现差不多啊,看来现在rails肯定支持更新父分类时自动实现count的±1。
05年的贴子:
http://dev.rubyonrails.org/ticket/3245
http://dev.rubyonrails.org/attachment/ticket/3245/belongs_to_counter_fix.diff
试着变换了写法,测试,OK了。
原写法:
if @blog.update_attributes(params[:blog])
新写法:
@blog = Blog.find(params[:id])
@blog.title = params[:blog][:title]
@blog.body = params[:blog][:body]
unless params[:blog][:blog_category_id].blank?
@blog.blog_category = BlogCategory.find(params[:blog][:blog_category_id])
end
@blog.save
这样就可以实现博客分类中的blogs_count字段完全自动维护了。
当博客变更分类时,变更后的分类与变更前的分类的博客数量可以实现自动±1,爽!
完。