1

ユーザーがアップロードしたファイルを保存するために、 carrierwave-postgresqlを使用しています。

FileUploader (/app/uploaders/file_uploader.rb 内) という名前のアップローダがありstorage :postgresql_loます。

アップロードされたファイルは、:file_oidUploadedFile というモデルの列 (app/models/uploaded_file.rb 内) にmount_uploader :file_oid, FileUploader次のようにリンクされます。

class UploadedFile < ActiveRecord::Base
  attr_accessible :file_oid, :processed, :type
  mount_uploader :file_oid, FileUploader
end

としてファイルをアップロードします

f = UploadedFile.new
f.file_oid = params[:flat_file]
f.save!

ファイルを読み取ろうとすると、readメソッドは正常に機能しますが、「each」または「open」を取得できません。

> uf = UploadedFile.find(:first)
> uf.file_oid.read # works, gives the contents of the file
> uf.file_oid.file.read # this works too
> uf.file_oid.file.each
NoMethodError: undefined method `each' for #<CarrierWave::Storage::PostgresqlLo::File:0x000000039157a0>
> uf.file_oid.file.open
NoMethodError: private method `open' called for #<CarrierWave::Storage::PostgresqlLo::File:0x000000039157a0>
> uf.file_oid.open
NoMethodError: private method `open' called for /uploadedfile_file_oid/231132:FileUploader
4

1 に答える 1

0

このクラスは、または;CarrierWave::Storage::PostgresqlLo::Fileのような派手なものはサポートしていません。全部を読んだり、全部を書いたり、サイズを取得したりする以外に、これらのオブジェクトの1つで多くのことを行うことはできません。eachopen

ただし、read実装を見ると、次のことがわかります。

@uploader.model.transaction do
  lo = connection.lo_open(identifier)
  content = connection.lo_read(lo, file_length)
  connection.lo_close(lo)
  content
end

したがって、carrierwave-postgresqlを完全にバイパスし、の基になる、、、およびメソッドを使用して、チャンクごとにラージオブジェクトを読み取ることができますもちろん、ラージオブジェクトシステムは行が何であるかを知らず、シーク可能なバイトストリームについて知っているだけなので、ラージオブジェクトを1行ずつ読み取ることはできません。lo_openlo_readlo_closeconnection

于 2013-02-11T05:19:15.980 に答える