私のモデルの1つに、データベースに格納する前に圧縮したい巨大なテキスト列があります(ディスク容量を節約するためではありませんが、それがここに Railsでデータベースに格納する前に属性を透過的に圧縮する
は私が書いてみました拡張機能の関連ですが、何らかの理由で、これは生産で動作していない場合私のデータベースはPostgreSQLのある)私のアプリサーバに私のDBサーバからネットワーク経由で圧縮されていないフィールドを送信します(実際にデータベースに格納されているデータは、Zlibの出力(例えば "A \ xEB \ xD3 \ xF2Oy = \ x9C \ x7F5 \ xE9 \ xC44 \ x01M")の代わりに16進数のように見えます(例: "34bee1c2d099ba21da3ac533d5f99cda2654feb73985430df39c5ffd8fbf9d9ff3aa9392d5a5" e何が起こっているのですか
module HasCompressedAttributes
def self.included(base)
base.extend ClassMethods
end
module ClassMethods
def has_compressed_attributes(*fields)
fields.each do |field|
define_method(:"#{field}=") do |uncompressed|
write_attribute(:"#{field}", Zlib::Deflate.deflate(uncompressed))
end
define_method(:"#{field}") do
Zlib::Inflate.inflate(read_attribute(:"#{field}")) rescue nil
end
end
end
end
end
ActiveRecord::Base.class_eval{ include HasCompressedAttributes }
もっと良いアプローチがありますか?多分既存の宝石ですか? PostgreSQLの最近のバージョンで
私は 'bytea'カラムを使用していますが、エンコーディングはまだ間違っています(私はProdとDevで全く同じデータベースを使用していますが、Devでは動作しますが、Prodではうまく機能しません) –
@Horace:Doあなたはdevとproductionで異なるPostgreSQLのバージョンを持っていますか? –
良い呼び出し - 9.0.3のDev、9.0.6。それが違いを生み出すかどうかわかりません。 –