`

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
分享到:
评论

相关推荐

    海宏自动升级update系统服务器端源代码.rar

    通常,服务器会保存每个版本的发布日期,当客户端查询时,会比较其当前版本与服务器上的最新版本的时间戳,如果客户端版本较旧,则触发升级流程。 【标签】"自动升级"进一步确认了系统的核心功能,即实现软件的自动...

    rack-timesec-源码.rar

    Rack::Timesec正是这样一个中间件,它的主要任务是在每个HTTP请求开始时记录时间戳,并在请求结束时计算并显示处理所用的时间。 Rack::Timesec源码的结构通常包含以下几个部分: 1. **初始化**:在Rack::Timesec...

    Ruby-ActiveRecord的BiTemporal数据模型

    3. **模型方法**:编写保存和查询方法,处理时态逻辑,例如插入、更新和查询时要考虑有效时间范围。 4. **查询接口**:提供查询方法,使得开发者可以方便地根据时间范围查询历史数据状态。 5. **事务处理**:确保在...

    bbs.zip_bbs论坛系统

    4. 时间戳和作者信息:记录主题创建时间及发布者。 **三、回复功能** 1. 评论回复:用户可以对已发布的主题进行回复,表达自己的观点。 2. 引用回复:用户可引用他人帖子,方便上下文讨论。 3. 楼层管理:按时间...

    chatApp:带SailsJS的应用

    用户表存储用户信息,聊天室表记录聊天室的元数据,消息表则保存每条聊天记录,包括发送者、接收者、消息内容和时间戳等信息。 6. **API设计**:SailsJS的RESTful API设计原则使得创建、读取、更新和删除(CRUD)...

    Trisul-开源

    1. **会话记录**:Trisul 能够跟踪和记录网络上的每一个连接会话,包括源IP、目的IP、端口信息以及通信的时间戳等,这对于网络行为审计和异常检测至关重要。 2. **流量统计**:它提供详细的流量统计报告,包括吞吐...

    form-object-qiita

    它也可能涉及如何集成到现有的 Rails 应用中,或者提供了一些额外的功能,比如自动处理时间戳、关联记录的创建和更新等。 标签 "Ruby" 暗示这与 Ruby 语言的核心特性或其生态系统有关。Ruby 提供了丰富的元编程能力...

Global site tag (gtag.js) - Google Analytics