`
netfork
  • 浏览: 492246 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

保证counter_cache在更新时也有效

    博客分类:
  • Ruby
阅读更多

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

 

完。

3
1
分享到:
评论
2 楼 yuan 2010-03-17  
JavaEye博客分类目前就有这个问题。
1 楼 ywencn 2009-11-24  
非常好,收藏了

相关推荐

    2_1_Cassandra配置文件中相关配置项详解

    只有当 commitlog_sync 设置为 periodic 时,此配置才有效。commitlog_segment_size_in_mb每个 commitlog 文件的最大大小。当 commitlog 文件达到这个大小时,Cassandra 将创建新的 commitlog 文件。memtable_flush_...

    缓存优秀实践

    1. Cache Aside:先查数据库,再查缓存,更新时先更新数据库,然后删除缓存,下次请求时再重建。 2. Write Through:写操作直接同步到数据库和缓存,保证数据一致性。 3. Write Behind:写操作先写入缓存,由后台...

    javascript 闭包实例

    1. **数据封装**:通过闭包,可以在函数内部创建私有变量,防止外部直接访问和修改,保证数据的安全性。例如: ```javascript function counter() { let count = 0; return function() { return count++; }; ...

    支持10000同步锁,Spring Boot,Java

    在Spring Boot框架中,我们同样可以有效地利用同步锁来处理并发问题。标题和描述提到的"支持10000同步锁"可能是指在特定场景下,系统能够同时处理的并发请求数量达到10000个,这需要高效且稳定的锁机制来保障程序的...

    2017年上半年软件设计师上午真题及答案解析高清完整.pdf版

    在计算冗余系统的可靠性时,通常会使用概率乘法规则。对于本题中的选项,正确答案应该是**D. (1-(1-R)3)+(1-(1-(1-R)2))**。这是因为该公式考虑到了各冗余部件之间的关系以及它们失效的概率。 ### 5. 海明码校验位...

    计算机软考~2016年下半年软件评测师(上午题)与答案

    在进行删除操作后,能保证链表不断开:单循环链表也需要额外的操作来保证链表不断开。 - D. 与单链表相比,更节省存储空间:实际上,单循环链表和单链表在存储空间方面并无显著区别。 **知识点扩展:** - **单...

    cpu设计思想与流程实现

    这涉及到对程序计数器(Program Counter, PC)的管理和更新,以保证指令的正确读取和执行。 - **操作控制**:根据指令的操作码控制算术逻辑单元(Arithmetic Logic Unit, ALU)等执行特定运算。 - **时间控制**:...

    java面试常见基础(深层次,高级研发)

    - 原子操作在多线程环境下能保证线程安全。 #### 13. Cas怎么实现unsafe? - **Unsafe**:提供底层操作,如内存访问和操作。 - **CAS**:Compare And Swap,比较并交换。 - **AtomicInteger**:利用CAS实现原子...

Global site tag (gtag.js) - Google Analytics