【问题标题】:How or where to override active record timestamp auto handling to use milliseconds如何或在何处覆盖活动记录时间戳自动处理以使用毫秒
【发布时间】:2013-11-30 05:52:20
【问题描述】:

我正在使用 sqlite 数据库设置(使用 sqlite 的要求),当我在架构中将 updated_at 和 created_at 定义为 INTEGER 时,我确实会从我假设处理的模型的更改中自动获取存储在这些列中的整数值活动记录(与活动模型相比)。

我想重新定义/修补该方法,使其使用 ms 而不是 s(即 1384639972645 与 1384639972)。 rails(类/模块/方法)中的这部分代码在哪里以及如何最好地解决这个问题?

我目前正在使用 3.2.11,但想知道 3 和 4 之间是否有不同的答案以供未来规划。

这是一个正确的假设,即时间戳到秒的这种转换是因为它定义为 INTEGER 发生在活动记录中而不是在 sqlite db 本身中?

【问题讨论】:

    标签: ruby-on-rails ruby sqlite activerecord


    【解决方案1】:

    嗯。这样的事情可能会奏效:

    module ActiveRecord
      module Timestamp
        def current_time_from_proper_timezone
          self.class.default_timezone == :utc ? (Time.now.utc.to_f*1000).to_i : (Time.now.to_f*1000).to_i
        end
      end
    end
    

    我可能会把它放在 config/initializers/timepatch.rb 中

    让我们试一试:

    pry(main)> require 'active_record'
    => true
    pry(main)> load 'timepatch.rb'
    => true
    pry(main)> ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: 'test.db')
    => #<ActiveRecord::ConnectionAdapters::ConnectionPool:0x40a70
    pry(main)> ActiveRecord::Migration.create_table(:kittens){|t| t.string :name; t.timestamps }
    -- create_table(:kittens)
       -> 0.1831s
    => {}
    pry(main)> class Kitten < ActiveRecord::Base
    pry(main)* end  
    => nil
    pry(main)> mr_pickles = Kitten.create name: "Mr. Pickles"
    => #<Kitten id: 1, name: "Mr. Pickles", created_at: 1384650727036, updated_at: 1384650727036>
    

    我认为这是在做你想做的事,但请记住,仅仅因为你可以并不意味着你应该这样做。 :)

    【讨论】:

    • 感谢迈克的回答。查看您的解决方案,我可以看到它似乎让我到达了我的目标,但我想知道我是否可以将此方法推到更远的下游,并更接近当前实现将 Time 对象转换为 Integer 对象的位置现在。此方法 current_time_from_proper_timezone 未经修改返回一个 Time 对象,我当前在列中得到一个 Integer,当列类型定义为 INTEGER 时,在该方法和数据库写入之间的某个位置,它被转换为 INTEGER。另外,您有什么顾虑?
    • 我对这样的事情的担忧是,猴子修补 AR 的基本方法,处理时间等基本问题(更改您将收集的每条数据)的后果可能会以痛苦告终在某一点。与日期数学有关的未来要求,可能会超过 sqlite,我不知道如何或何时,但我的直觉是假设这样的事情会以眼泪告终。你项目的细节可能意味着我的担忧是没有根据的。 AR 将日期转换为适合实际列类型的类型也就不足为奇了。
    • 如果我使用上面的示例,我会将它包装在一个条件块中,仅用于我需要它的模型。我想看看我是否可以将它推到更远的下游,甚至可能推到 sqlite 数据库本身的一个函数中,以便在那里进行转换和转换。尚未弄清楚这可能发生在哪里/如何发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多