【问题标题】:Milliseconds with Rails and MysqlRails 和 Mysql 的毫秒数
【发布时间】:2011-07-26 18:50:17
【问题描述】:

在使用 Rails+Mysql 时,以毫秒为单位存储时间的最佳方式是什么?

我将使用小数和composition_of 以便能够将这个值作为Ruby Time 来操作。有人有更好的主意吗?!

【问题讨论】:

  • 如果您需要将值作为 ruby​​ 时间对象进行操作,以毫秒为单位存储它有什么好处?
  • 然后我将能够根据此属性中的值对条目进行排序,并且不会丢失本应存储在数据库中的相关信息。

标签: ruby-on-rails ruby datetime time


【解决方案1】:

问这个问题已经过去好几年了。这是一个更新的解决方案:

https://gist.github.com/MarkMurphy/93adca601b05acffb8b5601df09f66df

【讨论】:

    【解决方案2】:

    我不确定我是否完全理解您要执行的操作,但您是否考虑过简单地覆盖模型中的读取器/写入器方法?如果这对您有用,那么它可能比您提出的解决方案更受欢迎,因为它可以说更具可读性。

    MyClass < ActiveRecord::Base
    
      # Override reader method
      def my_attribute
        super().from_milis
      end
    
      # Override writer method
      def my_attribute=(value)
        super(value.to_milis)
      end
    
    end
    

    【讨论】:

    • 这就是我在学习 Rails 聚合之前会做的事情。 :-) 虽然,超级不起作用。您应该改用 alias_method_chain。
    • 只是我的看法,但我不认为你在充分利用composed_of。使用 super 时是否出错?我希望这能奏效。它和 alias_method_chain 不是一回事,但你可以使用类似于 super() 的read_attribute(:my_attribute)self[:my_attribute]
    • 您为什么不同意composed_of 方法?在我看来,你应该使用 alias_method_chain 而不是 super,因为 getter 和 setter 最终可能已经被一些 alias_method_chain 调用重写,例如,在包含模块时。使用 super 你会失去所有这些功能。
    【解决方案3】:

    发布了一个使用composed_of在MySql中存储毫秒精度的解决方案

    http://ternarylabs.com/2011/09/26/millisecond-precision-timestamp-in-rails-with-mysql/

    【讨论】:

      【解决方案4】:

      1) 将其存储为 :decimal 并具有足够的精度。

      2) 自己创建一个辅助方法。像这样的:

      # app/helpers/application_helper.rb
      module ApplicationHelper
        def time_with_ms(time)
          minutes = (time % 1.minute).floor
          seconds = time % 1.minute
          "%02d:%05.2f" % [minutes, seconds]
        end
      end
      

      【讨论】:

      • 你的提议不如我以前的提议有趣。你不可能有足够的注意力阅读我的问题。
      【解决方案5】:

      我的方法是:

      打开时间类并实现方法 :from_milis 和 :to_milis :

      class Time
        def self.from_milis(milis)
          self.at(milis.to_f/1000)
        end
      
        def to_milis
          self.to_f*1000
        end
      end
      

      将列从时间戳迁移到 :decimal,:precision=>17

      然后,在我使用此列作为属性的 AR 类中:

      composed_of :ts,
          :class_name=>"Time",
          :mapping=>%w(ts to_milis),
          :constructor=>:from_milis,
          :converter=>:from_milis
      

      在 arel 查询中使用此属性时,我只是有 gochas,我必须显式调用 to_milis 才能在比较中获得预期值。

      【讨论】:

      • 我已经能够让这个解决方案适用于一个新的不受 rails 管理的列,但是我想更改“updated_at”列,以便它以我可以检索的方式存储它的值毫秒。我尝试修改上面的内容以使用“updated_at”,甚至尝试修改 ActiveSupport::TimeWithZone,因为您已经修改了上面的时间,但我无法让它正常工作。似乎 Rails 正在幕后做一些其他需要修改的事情。有什么想法吗?
      • updated_at 通常由 rails 自动管理,这可能就是您遇到问题的原因。我建议使用具有不同名称的列或寻找另一种方法来绕过自动更新此字段。
      猜你喜欢
      • 2012-06-08
      • 2015-06-25
      • 1970-01-01
      • 1970-01-01
      • 2018-12-07
      • 2018-12-25
      • 1970-01-01
      • 2014-06-30
      • 1970-01-01
      相关资源
      最近更新 更多