`

Rails保存记录而不更新时间戳

阅读更多

引用地址:

http://www.letrails.cn/archives/rails-update-record-without-timestamping/



Rails的save和 update方法默认都会将updated_at更新为当前时间,并且不允许手动设置,但是有些情况下,我们可能希望只更新记录的某个字段,而不希望 updated_at被更新,比如显示帖子的时候增加帖子的查看次数,这可以通过设置model的record_timestamps属性实现:

Post.record_timestamps=false

但是因为record_timestamps是一个类变量,因此改变这个值会影响到所有Post的保存,如果在同一时间有用户确实修改了Post的内容或者标题,updated_at也将不会更新。

Neeraj在这篇帖子里提供了一个方法,只修改当前对象的record_timestamps属性,在保存完后再进行恢复:
  module ActiveRecord
  class Base
    def save_without_timestamping
      class << self
        def record_timestamps; false; end
      end
      save
      class << self
        def record_timestamps; super ; end
      end
    end
  end
end


这段代码将打开当前对象的metaclass,并为当前对象定义一个record_timestamps方法来覆盖全局的设置,你可以将这段代码放到 initializer中,然后在不需要更新时间戳的时候调用save_without_timestamping来更新记录,就像下面这样:
post = Post.find(:id)
post.view_count += 1
post.save_without_timestamping


上面一个实现是通过super方法恢复record_timestamps设置的,Neeraj还提供了一个使用remove_method的版本,我个人更喜欢这个版本:

module ActiveRecord
  class Base
    def save_without_timestamping
      class << self
        def record_timestamps; false; end
      end
      save
      class << self
        remove_method :record_timestamps
      end
    end
  end
end
分享到:
评论

相关推荐

    rails_semantic_logger, Rails 语义记录器用语义记录器替换 Rails 缺省记录器.zip

    rails_semantic_logger, Rails 语义记录器用语义记录器替换 Rails 缺省记录器 Rails 语义记录器 语义记录器用语义记录器替代 Rails 缺省记录器。http://github.com/rocketjob/rails_semantic_logger文档有关完整文档...

    Rails相关电子书汇总

    8. **ActiveSupport**:包含许多实用的工具类和模块,如时间戳处理、字符串处理等,它们被广泛地应用于Rails应用中。 9. **测试驱动开发(TDD)和集成测试**:Rails鼓励开发者使用Test::Unit或Rspec进行测试,确保...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    - **升级**:当需要更新到Rails的最新版本时,可以使用`bundle update rails`命令来更新依赖。 - **回滚**:如果更新后出现问题,可以通过`git`命令或者手动修改`Gemfile`来回滚到之前的版本。 #### 六、添加第二个...

    rails for zombies

    更新操作用于修改数据库中的现有记录。可以通过以下方式实现: - **更新属性并保存**: ```ruby t = Tweet.find(3) t.zombie = "Eyeball Chomper" t.save ``` ##### 4. Delete 删除 删除操作用于从数据库中...

    Rails101_by_rails4.0

    随着Rails版本的更新迭代,此书聚焦于一个特定的版本,帮助开发者掌握在Rails 4.0环境下开发应用所需的关键技能。 书中介绍了Ruby on Rails安装的最佳实践,以及如何通过Git、编辑器和Linux命令行等前置技能的学习...

    rails敏捷开发的购物车系统

    Rails提供了Session存储,可以用来临时存储用户的购物车信息,但这种存储方式不适用于持久保存。因此,通常我们会将购物车内容存入数据库,以便用户在不同会话之间保持购物车状态。在添加或删除商品时,更新购物车...

    rails本地安装包完整版

    Rails 2.1.0引入了许多新特性,例如活动记录(ActiveRecord)的自动保存关联、部分渲染以及自定义验证选项等。 7. **activerecord-2.1.0.gem**:ActiveRecord是Rails中的ORM(对象关系映射)库,负责将数据库表映射...

    Rails项目源代码

    Ruby on Rails,通常简称为Rails,是一个基于Ruby编程语言的开源Web应用框架,遵循MVC(Model-View-Controller)架构模式。这个“Rails项目源代码”是一个使用Rails构建的图片分享网站的完整源代码,它揭示了如何...

    使用Aptana+Rails开发Rails Web应用(中文)

    在开发Web应用时,Ruby on Rails(简称Rails)框架因其高效、简洁的代码风格和强大的社区支持而备受青睐。Aptana是一款强大的集成开发环境(IDE),尤其适用于Rails项目的开发,它提供了丰富的特性来提升开发效率。...

    rails2-sample

    同时,表单是Web应用中不可或缺的部分,Rails提供了丰富的API来处理表单的创建和验证。此外,布局(Layouts)允许开发者在多个页面中重用公共的HTML代码,如头部和尾部,从而提高开发效率。 #### 7. Ajax and Web ...

    Ruby on Rails入门例子

    4. 实现CRUD操作:展示所有文章(index),新建文章(new),编辑文章(edit),保存或更新文章(create/update),删除文章(destroy)。 5. 测试:使用RSpec或MiniTest进行功能测试和集成测试,确保应用正常工作。...

    Rails中上传文件保存中文文件名乱码

    Rails默认使用UTF-8编码,但文件系统或者某些外部服务可能使用其他编码,如GBK,这就可能导致在保存或读取中文文件名时出现问题。 首先,我们需要了解Rails中的文件上传是如何工作的。在Rails中,文件上传通常通过`...

    web开发之rails最新调试通过购物车代码

    `CartItem`可能包含商品ID、数量和用户ID等字段,而`Order`模型则记录了客户的所有订单详情,包括购物车中的所有商品。 2. **控制器(Controller)**:处理HTTP请求,如添加商品到购物车、更新商品数量或查看购物车...

    关于rails 3.1 cucumber-rails 1.2.0

    Rails 3.1 和 Cucumber-Rails 1.2.0 是两个在Web开发领域非常重要的工具,尤其对于Ruby on Rails框架的测试和自动化流程。本文将深入探讨这两个组件,以及它们如何协同工作来增强软件开发的效率和质量。 首先,...

    ruby on rails 2.1 what is new (CN)

    而在接下来的几个月里,全球超过1400名开发者为Rails贡献了1600多个补丁,最终在2008年6月1日,Ruby on Rails 2.1正式发布。这次版本更新不仅带来了诸多新特性,还进一步优化了原有的功能。 #### Ruby on Rails 2.1...

    rails2.3.2

    描述中的 "ruby and rails 的框架rails-2.3.3.zip" 提到的是 Rails 的另一个版本 2.3.3,尽管与标题中的版本号不完全匹配,但我们可以推断这是关于 Rails 2.3.x 系列的讨论。这个压缩包很可能包含了 Rails 框架的源...

    Rails recipes

    综上所述,Rails Recipes是一本全面而深入的Rails指南,它不仅可以作为程序员解决具体问题的工具书,还可以作为提升 Rails 开发技能的进阶读物。无论是Rails新手还是经验丰富的开发者,都能从中获益,学会如何像大厨...

Global site tag (gtag.js) - Google Analytics