【问题标题】:Serialization to blob in rails 3序列化到rails 3中的blob
【发布时间】:2011-05-16 04:37:21
【问题描述】:

我有一个 Rails 应用程序,其中一个对象的属性之一是一个数据集,该数据集由一组 x,y 坐标组成。我目前正在使用 rails serialize helper 将其存储在 sql 数据库中:

序列化:数据,数组

这会将数组转换为 yaml,然后将其存储在 sql 数据库中的字符串字段中。问题是我们的数据库在这样做时变得非常大,我们需要让它更小。是否可以序列化为原始二进制而不是字符串并存储在 blob 中?这将大大减少大小并帮助我们解决问题。

我已经搜索了一个 gem 来执行此操作,甚至是一个 ruby​​ 方法,它可以在没有太多帮助的情况下将数组转换为二进制数据。任何建议将不胜感激。

【问题讨论】:

    标签: ruby-on-rails serialization binary


    【解决方案1】:

    您可能对 Array.pack 和 String.unpack 方法感兴趣。请参阅 ruby​​ 文档:输入 ri Array.pack

    您可能希望在数据库中使用“packed_data”属性,然后添加访问器以对其进行打包/解包:

    def data
      packed_data.unpack('....')
    end
    def data=(v)
      self.packed_data = v.pack('....')
    end
    

    为了使其更有用,您可以将解压后的表单存储在一个变量中,但您必须记住在 packed_data 属性更改时清除它,例如当您调用 .reload 时

    before_validation :pack_data
    
    UNPACK_FORMAT = '.....' # See ri Array.pack
    
    def data
      @data ||= packed_data.unpack(UNPACK_FORMAT)
    end
    def data=(v)
      @data = v
    end
    
    def reload(options=nil)
      @data = nil
      super
    end
    
    def pack_data
      self.packed_data = self.data.pack(UNPACK_FORMAT)
      true # Because we are in a before_.. callback
    end
    

    用于打包/解包数据的魔术字符串的格式取决于数组中的数据。文档将帮助您选择正确的。

    我相信打包和解包的格式是一样的,但不要太相信我。 ;)

    【讨论】:

      猜你喜欢
      • 2011-04-19
      • 2011-05-06
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 2015-09-18
      • 1970-01-01
      相关资源
      最近更新 更多