论坛首页 编程语言技术论坛

cache_fu的关联补丁(belongs_to, has_one) -- 补充

浏览 1891 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-10-14   最后修改:2010-10-14
原帖: http://www.iteye.com/topic/239580
原帖作者:秦朝古月
----
关于原帖中的【产生了2个缓存】的解决方案:
当两个类是一对一的关系时,例子如下:
class A < ActiveRecord::Base
  has_one :b
  acts_as_cached
end
class B < ActiveRecord::Base
  set_primary_key :a_id
  belongs_to :a
  acts_as_cached
end


A#b调用的时候使用的cache_id是b:#{b.id}, 也就是缓存中存在B:b:#{id}和B:#{id}两个同样值的cache;
当A的primary_key不仅仅是B的foreign_key,而且也是B的primary_key的时候,B:b:#{id}和B:#{id}两个cache的存在就失去了意义。
下面是改善方法(其他部分请参考原帖):
     class HasOneAssociation  
       def find_target_with_cached_association  
         # is the associated class using this class as it's cache id?  
         if @reflection.klass.respond_to?(:get_cache)
           if(@reflection.klass.primary_key == @reflection.primary_key_name)
             cache_id = @owner.id
           else
             cache_id =  "#{@reflection.primary_key_name}:#{@owner.id}"
           end
           @reflection.klass.get_cache(cache_id) {  
             find_target_without_cached_association  
           }  
         else  
           find_target_without_cached_association  
         end  
       end  
       alias_method_chain :find_target, :cached_association  
     end  
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics