保证counter_cache在更新时也有效

好比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,爽!

 

完。

你可能感兴趣的:(cache,Google,Blog,Rails)