`
mimosa
  • 浏览: 4972 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

Mongoid的counter_cache

阅读更多
引用
lib/mongoid/counter_cache.rb

# encoding: utf-8
module Mongoid #:nodoc:

	# This module handles the behaviour for Counter Cache.
	module CounterCache #:nodoc:
	  extend ActiveSupport::Concern
	  included do
	  	set_callback :create, :after, :increment_counter
	  	set_callback :destroy, :after, :decrement_counter
	  	unless methods.include? 'counter_cache'
	  	  class_attribute :counter_cache
	  	  self.counter_cache = true
	  	end
	  end

	  # used by increment_counter and decrement_counter
	  def update_counter(count)
	    if count.is_a?(Integer)
  	    associations = reflect_on_all_associations(:referenced_in)
  	    for association in associations
  	      parent_class = association.class_name.constantize
  	      counter_name = "#{association.inverse_of}_count"
  	      object_id = self["#{association.name}_id".to_sym]
  	      if !object_id.nil? && parent_class.fields.keys.include?(counter_name)
  	        parent_class.find(object_id).inc(counter_name.to_sym, count)
  	      end
  	    end
	    end
	  end
	  
	  # Increment a number field by one, usually representing a count.
	  # This is only called on create.
	  #
	  # @example Increment a number field by one.
	  #   post.increment_counter
	  def increment_counter
	    update_counter(1)
	  end
	  
	  # Decrement a number field by one, usually representing a count.
	  # This is only called on destroy.
	  #
	  # @example Decrement a number field by one.
	  #   post.decrement_counter
	  def decrement_counter
	  	update_counter(-1)
	  end
	end
end

引用
app/models/blog.rb

require 'rtranslate' # 谷歌翻譯
require 'mongoid/counter_cache'
class Blog
  include Mongoid::Document
  include Mongoid::Timestamps
  include Mongoid::CounterCache
  # 數據關聯
  referenced_in :owner, # 擁有者
    :class_name => 'Person', :inverse_of => :blogs
  references_many :posts # 帖子
  # 數據效驗
  validates :title, :presence => true
  validates :permalink,
    :uniqueness => true, 
    :length => { :minimum => 4 },
    :allow_blank => true,
    :format => { :with => /^[a-zA-Z0-9\_\-\ ]*?$/i }
  # 數據字段
  field :title, :null => false
  field :permalink, :null => false
  field :tagline
  field :owner_name
  field :owner_avatar
  # 計數器
  field :posts_count, :type => Integer, :default => 0 # 帖子數
  # 主鍵
  key :permalink
  # 索引
  index :permalink, :unique => true
  # 作用域:
  default_scope desc(:updated_at) # 默認
  # 回調:
  before_validation :generate_permalink

  # 所有者信息
  def owner=(person)
    self.owner_id = person.id
    self.owner_name = person.display_name
    self.owner_avatar = person.avatar!
  end
  
  protected
  
  def generate_permalink # 翻譯成英文
    self.permalink = Translate.t(title, 'UNKNOWN', 'English') if permalink.blank?
  end
end
分享到:
评论
1 楼 mimosa 2011-06-07  
你太悲劇啦
應該這樣有木有

相关推荐

    VHDL例程源码 counter_n

    VHDL例程源码 counter_nVHDL例程源码 counter_nVHDL例程源码 counter_nVHDL例程源码 counter_nVHDL例程源码 counter_nVHDL例程源码 counter_nVHDL例程源码 counter_nVHDL例程源码 counter_nVHDL例程源码 counter_...

    custom_counter_cache:支持条件和多种模型的自定义counter_cache功能

    gem 'custom_counter_cache' 示例 带计数器缓存的类 这是将用于计算计数器缓存的值的块。 其他模型将通过after_save或after_destroy回调通过它们的关联来调用它。 include CustomCounterCache :: Model define_...

    视频中工程代码 class5_counter_ip

    视频中工程代码 class5_counter_ip视频中工程代码 class5_counter_ip视频中工程代码 class5_counter_ip视频中工程代码 class5_counter_ip视频中工程代码 class5_counter_ip视频中工程代码 class5_counter_ip视频中...

    counter_99.rar_counter_guide99.con_vhdl xilinx counter

    本压缩包"counter_99.rar"包含了一个名为"counter_guide99.con"的VHDL源码文件,用于实现一个在Xilinx Spartan3 FPGA上的计数器设计。下面我们将详细探讨这个计数器的设计、功能以及与Xilinx FPGA的集成。 首先,...

    Line_Counter_2008

    《Line_Counter_2008:代码行统计利器在.NET平台的应用》 在软件开发过程中,代码行数(LOC,Lines of Code)是衡量项目规模、复杂度和工作量的重要指标之一。Line_Counter_2008,正如其名,是一款专为开发者设计的...

    counter_4_bit.rar_4-bit counter vhdl_4bit 计数器 mc_counter_vhdl_vh

    在这个名为“counter_4_bit.rar”的压缩包中,包含了一个4位计数器的设计实例,对于学习和理解VHDL编程以及数字逻辑电路设计具有很高的参考价值。4位计数器是一个能够顺序计数从0到15的数字系统,它在许多数字系统和...

    8_COUNTER_lpc2138counter_源码

    标题中的“8_COUNTER_lpc2138counter_源码”指的是一个针对LPC2138微控制器的计数器应用示例的源代码。LPC2138是NXP公司生产的一款基于ARM7TDMI-S内核的微控制器,具有高性能、低功耗的特点,广泛应用于嵌入式系统...

    binarycount.rar_Synchronous Counter_VHDL 计数器_binary counter_bina

    "binarycount.rar_Synchronous Counter_VHDL 计数器_binary counter_bina"这个标题明确指出了我们要探讨的是一个使用VHDL实现的同步二进制计数器。同步计数器的特点是其所有触发器在同一时钟边沿同步改变状态,这...

    Up_Down_Counter v1.0.zip_UP_counter_fpga_fpga的down_counter_modul

    标题"Up_Down_Counter v1.0.zip_UP_counter_fpga_fpga的down_counter_module"揭示了这是一个关于FPGA实现的可逆计数器,能够进行向上或向下计数的版本1.0的工程文件。描述" FPGA Up/Down couner Module"进一步确认了...

    tb_counter.zip_counter_tb

    本篇文章将详细探讨`tb_counter.zip_counter_tb`这个项目,它是用VHDL(Very High-Speed Integrated Circuit Hardware Description Language)编写的测试平台,主要用于验证一个计数器的设计,并理解其工作原理。...

    Counter---PIC.rar_counter_pic counter_pic16f887

    标题中的“Counter---PIC.rar_counter_pic counter_pic16f887”暗示了这是一个关于使用PIC16F887微控制器实现计数功能的项目。PIC16F887是Microchip Technology公司生产的8位微控制器,常用于嵌入式系统设计,因其低...

    counter_99.rar_0到99倒计数_0~99的倒计数_counter_verilog99计数器_倒计数

    本文将深入探讨一个特定的Verilog实现:一个从99到1进行倒计数并自动回零的计数器,这个计数器被称为“counter_99”。这个设计实例不仅展示了Verilog的基本语法,还演示了如何构建一个具有特定功能的数字逻辑电路。 ...

    Counter_FPGAVHDL_

    本文将深入探讨"Counter_FPGAVHDL_"相关的知识点,以及如何利用VHDL来设计和测试一个时钟计数器。 标题"Counter_FPGAVHDL_"暗示了我们将在FPGA上实现一个基于VHDL的计数器。计数器是数字系统中最基本的组件,用于...

    Python库 | django_counter_field_py3-0.0.1.2.tar.gz

    标题中的"Python库 | django_counter_field_py3-0.0.1.2.tar.gz"指出这是一个基于Python的软件包,具体来说是针对Django框架的一个扩展模块,名为`django_counter_field`. 这个版本号0.0.1.2表明它是该库的早期版本...

    8bit_upDown_counter.rar_ UP DOWN COUNTER_8 bit counter_UP_count

    在这个上下文中的"8bit_upDown_counter.rar"是一个包含8位增减计数器设计的压缩文件,它被描述为简单、实用且优化过的实现。这个计数器能够进行向上(UP)和向下(DOWN)两种方向的计数,从0到255(8位二进制的最大...

    bcd_updown_counter2.zip_4 digit counter_BCD up down Counter_bcd_

    总之,这个名为“bcd_updown_counter2”的项目提供了一个4位BCD加减计数器的Verilog实现,可以作为数字系统设计的基础组件,用于教育、学习或实际应用。通过理解这个计数器的工作原理和Verilog代码,我们可以更好地...

    counter_16_计数输入clk_计数器_

    标题"counter_16_计数输入clk_计数器_"指的是一个具有16位计数能力的计数器,它主要依赖于时钟信号(CLK)来实现计数功能。 计数器是数字系统中的一个基本组成部分,其功能是根据特定的输入信号(在这种情况下是...

    MOD6COUNT_counter_modulo_

    标题“MOD6COUNT_counter_modulo_”提示我们这是一个与计数器相关的程序或设计,特别是模6计数器。模6计数器是一种数字逻辑电路,它在每次时钟脉冲后将计数值增加1,并在达到6后重置回0,如此循环。这种类型的计数器...

    up_down_counter.rar_32 counter_UP_up down count_up/down counter_

    architecture Behavioral of up_down_counter is begin process(clk, reset) begin if reset = '1' then count_out (others => '0'); -- Reset to 0 elsif rising_edge(clk) then -- On clock's positive edge ...

    counter_ip_verilog_

    "counter_ip_verilog_" 这个标题表明我们正在讨论一个使用 Verilog 编写的计数器IP( Intellectual Property)核心。IP核是预设计的、可重用的硬件模块,可以方便地集成到更大的电路设计中。这个项目特别适合初学者...

Global site tag (gtag.js) - Google Analytics