`
秦朝古月
  • 浏览: 226870 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

cache_fu的关联补丁(belongs_to, has_one)

    博客分类:
  • Ruby
阅读更多
为了缓解数据库服务器的繁忙状态,准备加入memcache。
"SELECT * FROM table WHERE table.id = value" 这样的简单检索占了全局的30%,把这样的检索进行缓存可以很大程度的减少访问数据库的次数。Place.find(id)以及account.place这样的关联,会产生上边的简单检索。

Place.find(id)可以简单的用Place.get_cache(id)代替。

belongs_to和has_one关联的对应,参考了 http://jack.iteye.com/blog/169736 和 http://groups.google.co.jp/group/acts_as_cached/browse_thread/thread/5fefb2d2355a5048 。

module ActiveRecord
  module Associations
    class BelongsToAssociation
      def find_target_with_cached_association
        # is the associated class using it's own id as it's cache id?
        if @reflection.klass.respond_to?(:get_cache) &&
          (@reflection.klass.cache_config[:cache_id] || :id) == :id
          @reflection.klass.get_cache(@owner.send(@reflection.primary_key_name))
        else
          find_target_without_cached_association
        end
      end
      alias_method_chain :find_target, :cached_association
    end

    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)
          @reflection.klass.get_cache("#{@reflection.primary_key_name}:#{@owner.id}") {
            find_target_without_cached_association
          }
        else
          find_target_without_cached_association
        end
      end
      alias_method_chain :find_target, :cached_association
    end
  end
end 


需要注意的是,采用这种方法,对于从表记录,其实产生了2个缓存。例如,Account:id,Account:name:<name>。在释放缓存的时候需要注意。

has_many关联的也想进行缓存,现在最大的问题不是如何写入缓存,而是修改后如何释放。Place A修改的时候,如何把所有包含A的集合的缓存全部释放。缓存被要求及时更新。修改者本人相关的集合缓存的释放相对来说比较容易,可是他人的集合缓存呢?突然想到mixi的缓存方法,作者本人可以马上看到更新,而其他人是要过几分钟才可以看到更新的。这个是比较容易实现的,只要在集合缓存时设定好时限就可以了。值得考虑一下。
分享到:
评论

相关推荐

    validates_existence:验证 Rails 模型belongs_to 关联是否存在

    这个插件库添加了 ActiveRecord 模型,一种在保存时检查:belongs_to关联是否实际存在的方法。 这是通过向基本验证模块添加validates_existence_of器来实现的。 它还支持:allow_nil =&gt; true/false 、 :allow_new =&gt; ...

    ThinkPHP关联模型操作实例分析

    通常我们所说的关联关系包括下面三种: ◇ 一对一关联 : ONE_TO_ONE , 包括 HAS_ONE 和 BELONGS_TO ◇ 一对多关联 : ONE_TO_MANY , 包括 HAS_MANY 和 BELONGS_TO ◇ 多对多关联 : MANY_TO_MANY 关联定义 数据表...

    thinkPHP3.x常量整理(预定义常量/路径常量/系统常量)

    本文整理总结了thinkPHP3.x常用的...BELONGS_TO=2 BELONGS_TO 关联定义 HAS_MANY=3 HAS_MANY 关联定义 MANY_TO_MANY=4 MANY_TO_MANY 关联定义 THINK_VERSION 框架版本号 这些预定义常量不会随着环境的变化而变化。 二、

    activemodel-associations, 用于普通 ruby 对象的has_many和belongs_to宏.zip

    activemodel-associations, 用于普通 ruby 对象的has_many和belongs_to宏 ActiveModel::Associations 用于普通 ruby 对象的has_many 和 belongs_to 宏。安装将此行添加到你的应用程序的Gemfile中:gem 'activemodel-

    fixture_dependencies:SequelActiveRecord夹具加载器,用于处理依赖关系图

    支持many_to_one / belongs_to,one_to_many / has_many,many_to_many / has_and_belongs_to_many和has_one / one_to_one关联 以不违反外键约束的方式加载灯具的依赖关系图 有一个非常简单的API...

    Laravel开发-belongs-to-one

    `hasOne` 方法与 `belongsTo` 类似,只是它表示一个模型拥有一对多的关系。 一旦定义了这些关联,我们就可以方便地进行各种操作。例如,获取一个用户的相关个人资料: ```php $user = User::find(1); $profile = $...

    关于Rails中的表关联的程序

    Rails提供了四种基本的关联类型:` belongs_to`、` has_one`、` has_many` 和 `has_and_belongs_to_many`。这些关联允许我们建立对象之间的关系,从而在编程时简化数据的存取。 1. `belongs_to` 关联: 这种关联...

    administrate-field-belongs_to_search:该插件将搜索功能添加到Administrate的belongs_to关联中

    管理::字段::属于搜索 一个插件,用于搜索 Rails引擎中的belongs_to关联。用法将其添加到您的Gemfile : gem 'administrate-field-belongs_to_search' 运行捆绑程序以安装: bundle install 将其添加到“管理”仪表...

    one_plus_n_detector:Elixir库可帮助您使用Ecto检测应用程序中的1 + n个查询

    当您具有诸如has_many , has_one或belongs_to has_many的父子关系时,您可以通过一个查询加载父记录,然后为每条记录触发另一个SQL语句以加载相关的孩子。 假设您有以下Ecto模式 defmodule User do use Ecto . ...

    belongs_to_hstore:使用postgresql hstore列创建ActiveRecord所属_关联

    使用postgresql hstore列创建ActiveRecord Emirates_to关联。 与多态关联兼容,并支持预先加载。 安装 将此行添加到您的应用程序的Gemfile中: gem 'activerecord-postgres-hstore' # Rails 3 only gem 'belongs_...

    Laravel开发-belongs-to-through

    在传统的Eloquent ORM中,我们有基本的`belongsTo`、`hasOne`、`hasMany`、`belongsToMany`等关系。`belongs-to-through`是这些基础关系的扩展,它通过一个中间模型来连接两个原本没有直接关系的模型。假设我们有三...

    model_sandbox

    包含产品的属性,尤其是价格(代表美分的整数),与User的belongs_to关联和与Purchases的has_many关联。 此模型的迁移需要: 用户索引: t.index ["user_id"], name: "index_products_on_user_id"以有效地搜索用户...

    has_array_of:PostgreSQL数组上的ActiveRecord关联

    该插件使用PostgreSQL数组的功能实现了在Rails中进行has_and_belongs_to_many关联的替代方法。 在很多情况下,你只需要或的功能使用许多一对多与连接表是不必要的传统方法。 我们可以只存储id的整数数组。 它是如何...

    详解YII关联查询

    - **RelationType**: 指定关系的类型,如`self::BELONGS_TO`, `self::HAS_ONE`, `self::HAS_MANY`, `self::MANY_MANY`。 - **ClassName**: 关联的Active Record类的名称。 - **ForeignKey**: 在关系中使用的外键。 -...

    ThinkPHP中的关联模型注意点

    在ThinkPHP中,关联模型基于`RelationModel`类,它可以定义不同类型的关联,如`BELONGS_TO`(一对一),`HAS_ONE`(一对多),`HAS_MANY`(多对多)等。关联模型通过`_link`属性来配置关联关系,这个属性是一个关联...

    基于laravel belongsTo使用详解

    在这个框架中,`belongsTo`方法是一种十分常见的关联操作,用于在一对多关系中从“多”的一方去关联“一”的一方。这篇文档详细讲解了如何在Laravel中使用`belongsTo`方法,包括其基本概念、使用场景以及在实际代码...

    thinkphp关联模型的使用

    在ThinkPHP中,可以通过`belongsTo()`或`hasOne()`方法定义一对一关联。例如,用户表和用户详情表,用户详情表的外键指向用户表的主键,可以这样定义: ```php // 在User模型中 public function detail() { return...

    has_cache:Rails 缓存存储的便利包装器

    缓存 便利包装器 在您的类中使用has_cache提供了一个cached方法,该方法允许自动缓存通常在类或类的实例上可用的方法的... belongs_to :user , inverse_of : :posts end 填充和检索缓存的实体 在类上启用缓存后,您可以

Global site tag (gtag.js) - Google Analytics