私は、attachment_fuを使用してユーザーからのファイルのアップロードを受け入れるモデル、たとえばAttachmentsを持っています。添付ファイルを「ディープコピー」(またはRuby-eseではディープクローン)して、「db_files」テーブルに完全に新しいバイナリオブジェクトを作成したいと思います。
私はそれがまだ完全に解決された問題ではないことを発見しました。このブログ投稿: http ://www.williambharding.com/blog/rails/rails-faster-clonecopy-of-attachment_fu-images/
ファイルシステムベースのストレージで機能するとされるメソッドを示します。dbベースのストアの場合、「ディープコピー」は失敗します。新しい「添付ファイル」が作成されますが、既存のdb_file_idを使用するため、浅いコピーが実行されます。
attachment_fuのdb_file_backend.rbの中に、saveメソッドがあります。
# Saves the data to the DbFile model
def save_to_storage
if save_attachment?
(db_file || build_db_file).data = temp_data
db_file.save!
self.class.update_all ['db_file_id = ?', self.db_file_id = db_file.id], ['id = ?', id]
end
true
end
だから、私はこれを解読しようとしています。これを確認することはできませんが、「build_db_file」はDbFile.newのRubyメタプログラミングの魔法の省略形であると信じています(ソースを取得すると、これについての言及はなく、Googleで見つけることもできません)。
それが何をしているのかよくわかりませんが、私の理論では、db_fileは(リンクされたコードの)「ディープコピー」の試みの一部としてソースobjからコピーされているため、作成。
私の最初の理論は、深いコピーを試みると親(添付ファイル)オブジェクトが「新規」に設定されるというものでした。したがって、次のようなことを行いました。
def save_to_storage
if save_attachment?
if self.new_record?
db_file = DbFile.new :data => temp_data
self.class.update_all ['db_file_id = ?', self.db_file_id = db_file.id], ['id = ?', id]
end
end
true
end
これは実際には複製されたオブジェクトに対しては正常に機能しますが、残念ながら、複製されていない通常のファイルアップロードのすべてのテストは失敗します。Attachmentオブジェクトは作成されますが、db_fileにデータは書き込まれません。理論では、親オブジェクトが最初に保存され、次にdb_fileのものが後で書き込まれるため、new_record?falseを返します。
そこで、実験として、次のことを試してみることにしました。
def save_to_storage
if save_attachment?
if self.new_record?
db_file = DbFile.new :data => temp_data
self.class.update_all ['db_file_id = ?', self.db_file_id = db_file.id], ['id = ?', id]
else
(db_file || build_db_file).data = temp_data
db_file.save!
self.class.update_all ['db_file_id = ?', self.db_file_id = db_file.id], ['id = ?', id]
#end
end
true
end
これは部分的に機能します-db_fileにデータが入力されますが、db_file.saveでエラーが発生します!--db_fileがnilであると言っています。
だから、私は一種の窮地に立たされています。さらに試行錯誤することはできますが、この時点で、このプラグインがどのように機能するかについての理解が限られています。私は本当にこれほど多くの時間を費やすことを期待していなかったし、したくなかったので、attachment_fuをこれ以上探求するのは気が進まないが、それを理解するためにうさぎの穴を下る必要があるのではないかと心配している。何かアイデアや考えはありますか?
ありがとう!!