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

ActiveRecord::Base.update 的 alias_method_chain 顺序变化

    博客分类:
  • Ruby
阅读更多
alias_method_chain有非常强大的功能,使得我们对Rails的功能扩展变得很容易。考虑过当一个方法存在多个alias_method_chain时,without方法会变成什么样子呢?但一直没有做相关的调查。
在进行Rails2.2.2到2.3.8的升级过程中,终于遭遇了这个问题。
ActiveRecord::Base的update方法,有四个alias_method_chain:
base.alias_method_chain :update, :callbacks
base.alias_method_chain :update, :timestamps
base.alias_method_chain :update, :dirty
base.alias_method_chain :update, :lock

由于我们的程序会在后台处理客户的信息,而不像改变updated_at,所以公有化了update_without_timestamps,显示的调用它。而在update_without_timestamps执行后,我们需要after_update来触发缓存的清空/更新。

Rails2.2.2里,method_chain实际工作顺序如下。update_without_timestamps执行后,正确的执行了callbacks来清空缓存,我们的程序工作正常。
引用

update_with_timestamps # update_without_timestamps = update_with_callbacks
update_with_callbacks
update_with_dirty
update_with_lock


但是在2.3.8下,method_chain工作顺序变化了。执行update_without_timestamps的时候,直接跳过了update_with_callbacks,程序出错。
引用
update_with_callbacks
update_with_timestamps # update_without_timestamps = update_with_dirty
update_with_dirty
update_with_lock


看来在享用alias_method_chain便利的同时,还要注意它的一些细节呀。

代码的修改其实很简单,只要利用ActiveRecord::Base.record_timestamps = false就好了。
分享到:
评论

相关推荐

    active-record-associations

    确保两个模型都继承自ActiveRecord :: Base class Firm < ActiveRecord :: Base #... end class Client < ActiveRecord :: Base #... end 添加您的has_many和belongs_to class Firm < ...

    ActiveRecord简单实例_activerecord.zip

    在Ruby on Rails框架中,ActiveRecord是一个至关重要的组件,它负责模型(Model)与数据库之间的交互。本实例将深入探讨ActiveRecord的基本用法,帮助理解如何在实际开发中有效地运用这个强大的工具。 首先,让我们...

    in_batches:ActiveRecord的反向移植

    针对Rails 4应用程序的ActiveRecord::Relation#in_batches实验性ActiveRecord::Relation#in_batches移植。安装将此行添加到您的Gemfile中。 gem "activerecord-in_batches", git: "git://github....

    resque-async:使用resque异步调用方法的简单方法

    ActiveRecord :: Base def self . slow_class_method end def slow_instance_method end end 支持类方法和ActiveRecord实例方法 MyObject . async ( :high ) . slow_class_method # ActiveRecord in

    otr-activerecord:离轨

    主动记录一种轻松使用ActiveRecord的...配置您的数据库连接加载了gem之后,请使用以下示例之一将有关数据库配置的信息告知OTR::ActiveRecord : OTR::ActiveRecord.configure_from_file! "config/database.yml"OTR::

    Redis 支持的活动提要时间线.zip

    示例简单的方法...class Post < ActiveRecord::Base include Timeline::Track track :new_postend默认情况下,跟踪在after_create模型的回调中触发,并用作self对象和creator参与者。您可以明确指定这些选项...class...

    ruby声明式语法的实现例子

    在ActiveRecord可以用很方便的声明方式来定义model之间的关联关系,例如: 代码如下: class Topic < ActiveRecord::Base  has_many :posts  belongs_to :user end has_many和belongs_to其实是Topic类的class ...

    redstream:使用Redis流使您的主数据库与辅助数据存储保持同步

    红流 使用redis流使您的主数据库与辅助数据存储(例如elastic... ActiveRecord :: Base include Redstream :: Model # ... redstream_callbacks # ... end redstream_callbacks将after_save , after_touch , a

    将用户头像添加到Devise的RailsActiveStorage示例_Ruby_H.zip

    class CreateUsers < ActiveRecord::Migration[5.2] def change create_table :users do |t| t.string :email, null: false, default: '' t.string :encrypted_password, null: false, default: '' t.string :...

    Ruby的25个编程细节(技巧、实用代码段)

    ActiveRecord::Base.include_root_in_json = true # Store the full classname (including module namespace) in STI type column. ActiveRecord::Base.store_full_sti_class = true end ActionController::...

    Redis 的 ORM.zip

    Redis 的 ORMRedisOrm几乎可以替代 ActiveRecord 2.x。它基于Redis - 高级键值存储,并且正在开发中。这是标准模型定义class User < RedisOrm::Base property :first_name, String property :last_name, String ...

    Castle.ActiveRecord (.NET FrameWork 2.0)

    Castle.ActiveRecord For .NET FrameWork 2.0 ...Castle.ActiveRecord.dll:V2.1.2.6725 NHibernate.dll:V2.1.2.4000 Castle.Core.dll:V1.1.0.0 Castle.Components.Validator.dll:V1.0.3.4333

    Ruby-on-Rails-3.rar_site:www.pudn.com

    4. **ActiveRecord**:介绍Rails的ORM(对象关系映射)系统,包括模型的创建、关联、查询以及迁移操作。 5. **视图与模板**:讲解ERB或Haml等模板语言,如何渲染HTML并结合Helper方法创建动态视图。 6. **控制器**:...

    identity_cache_fetchers:用于 IdentityCache 的 ActiveRecord#fetch_or_initialize 和 ActiveRecord#fetch_or_create

    ActiveRecord :: Base include IdentityCache include IdentityCacheFetchers cache_index :handle , unique : true cache_index :vendor , :product_typeend 这个 gem 为您带来了等价物,但使用 IdentityCache ...

    association_callbacks:ActiveRecord关联的回调

    ActiveRecord :: Base has_many :comments end class Comment < ActiveRecord :: Base belongs_to :article end 然后,您通常需要将Comment内容反规范化为Post ,反之亦然。 这是在帖子上反规范last_comment_...

    Ruby-marginalia添加评论至ActiveRecord的SQL查询

    Ruby是一种动态、面向对象的编程语言,而ActiveRecord是Ruby on Rails框架中的一个核心组件,它作为ORM(Object-Relational Mapping)工具,使得开发者可以用Ruby代码操作数据库,无需直接编写SQL语句。ORM框架的...

    activerecord-relations_annotations:使用自定义数据注释 ActiveRecord 关系对象

    关系注解使用自定义数据注释 ActiveRecord 关系对象,... ActiveRecord :: base include ActiveRecord :: RelationsAnnotationsendusers = User . where . not ( email : nil )with_email_users = users . annotate

    Sortiri是一种干净轻巧的解决方案,用于使ActiveRecord :: Base对象可排序-Ruby开发

    Sortiri是一种干净轻巧的解决方案,用于使ActiveRecord :: Base对象可排序。 描述Sortiri是一种干净轻巧的解决方案,用于使ActiveRecord :: Base对象可排序。 入门Ruby 2.6.0和更高版本上的ActiveRecord 4.2+支持...

    smart_json:像 As_json 一样的人,他正确地做 N + 1 而不包括

    ActiveRecord :: Base smart_json_style ( :simple ) { { title : title } } smart_json_style ( :with_detail , :simple , author : :only_name , comments : :with_user ) end class User < ActiveRecord ::...

    Ruby-SQLServerRailsActiveRecord的SQLServer适配器

    本主题将深入探讨如何在Rails应用中使用SQL Server作为数据存储,特别关注`activerecord-sqlserver-adapter`这个gem,它使得Ruby的ActiveRecord能够与Microsoft SQL Server无缝集成。 `activerecord-sqlserver-...

Global site tag (gtag.js) - Google Analytics