【问题标题】:Ruby on Rails: Decompression (Zlib::Deflate) doesn't work after certain amount of timeRuby on Rails:解压缩(Zlib::Deflate)在一定时间后不起作用
【发布时间】:2011-10-16 00:04:44
【问题描述】:

我需要在将大量文本保存到数据库之前对其进行压缩,并在客户端请求时将其解压缩。

当我使用 Rails 控制台插入新记录并立即查询新插入的记录时,我现在使用的方法似乎工作正常。即,我可以成功解压压缩的描述。

但我无法为在此日期之前添加的任何其他记录解压缩压缩的 description。我真的很困惑,尤其是作为 ROR 世界的新手。

我正在使用MySQL 作为数据库。

能否请您指出正确的方向?请查看下面的模型以更好地理解它。

require "base64"

class Video < ActiveRecord::Base
  before_save :compress_description

  def desc
    unless description.blank?
      return decompress(description)
    end
  end

  private

  def compress_description
    unless description.blank?
      self.description = compress(description)
    end
  end

  def compress(text)
    Base64.encode64(Zlib::Deflate.new(nil, -Zlib::MAX_WBITS).deflate(text, Zlib::FINISH))
  end

  def decompress(text)
    Zlib::Inflate.new(-Zlib::MAX_WBITS).inflate(Base64.decode64(text))
  end
end

【问题讨论】:

  • 你能告诉我你是如何使用这个模型的吗?我尝试了同样的事情,对我来说效果很好。我怀疑您在查找未加密字符串时可能使用的是描述而不是 desc 方法,但我想确认是否是这种情况。
  • @user420504: 不,我使用的是desc,如果我在同一天获得插入的记录,desc 确实有效。但是如果我在几天后尝试拉同样的记录,它只会给我junk

标签: mysql ruby-on-rails ruby ruby-on-rails-3 zlib


【解决方案1】:

好的,重现您的问题实际上非常容易。在 Rails 控制台中执行以下操作

Video.create(:description => "This is a test")
Video.last.description
=> "C8nILFYAokSFktTiEgA=\n" 
Video.last.desc
=> "This is a test" 
Video.last.save #This update corrupts the description
Video.last.desc
=> "C8nILFYAokSFktTiEgA=\n"

发生损坏的原因是因为您正在压缩一个已经压缩的字符串

你可能应该如下修改你的类,你应该没问题

require 'base64'
class Video < ActiveRecord::Base
  before_save :compress_description
  after_find :decompress_description
  attr_accessor :uncompressed_description

  private

  def compress_description
    unless @uncompressed_description.blank?
    self.description = compress(@uncompressed_description)
    end
  end

  def decompress_description
    unless description.blank?
      @uncompressed_description = decompress(description)
    end
  end

  def compress(text)
    Base64.encode64(Zlib::Deflate.new(nil, -Zlib::MAX_WBITS).deflate(text, Zlib::FINISH))
  end

  def decompress(text)
    Zlib::Inflate.new(-Zlib::MAX_WBITS).inflate(Base64.decode64(text))
  end
end

现在如下使用你的类

Video.create(:uncompressed_description => "This is a test")
Video.last.description
=> "C8nILFYAokSFktTiEgA=\n" 
Video.last.uncompressed_description
=> "This is a test" 
Video.last.save
Video.last.uncompressed_description
=> "This is a test" 

【讨论】:

    猜你喜欢
    • 2011-09-06
    • 2016-01-06
    • 2017-11-08
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    相关资源
    最近更新 更多