Railsの、Attachment_fu - データベース・ストレージ・添付ファイルのディープコピー

StackOverflow https://stackoverflow.com/questions/2205110

質問

私はモデルを持っている、のは、ユーザーからのファイルのアップロードを受け入れるためにattachment_fuを使用して添付ファイルを、言ってみましょう。私は、このように「DB_FILES」テーブルに全く新しいバイナリオブジェクトを作成し、添付ファイル「ディープコピー」(やRuby-ESE、深いクローンで)したい。

私はそれはまだかなり解決される問題ではないことがわかりました。このブログの投稿: http://www.williambharding.com/blog /レール/レール-速いclonecopy・オブ・attachment_fu-画像/

は、伝えられるところでは、ファイルシステムベースのストレージのために働く方法を表示します。 DBベースの店舗については、「ディープコピーは」失敗します。新しい「添付ファイル」が作成されますが、それはこのように浅いコピーを実行、既存のdb_file_idを使用しています。

attachment_fuのdb_file_backend.rb内部I保存方法を参照してください。

      # 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は」(ソースをgrepをすると、このの言及を示していない、また私はGoogleでそれを見つけることができます)DbFile.newためのいくつかのRubyのメタプログラミングのマジック速記であると考えていますます。

私はそれが何をしているのか、非常にわからないんだけど、私の理論はは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

これは実際にクローン化されたオブジェクトのため正常に動作しますが、定期的に、非クローン化されたファイルのアップロードのため、残念ながら、すべてのテストが失敗。添付ファイルオブジェクトが作成されますが、何のデータがDB_Fileをするために書き込まれません。理論は、親オブジェクトがnew_recordので、その後はDB_Fileものが、後に書かれている、最初に保存されていることでしょうか? 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任意の更しようとすると、探索には消極的ですが、私はそれを把握するためにウサギの穴を下に行かなければならないつもりです怖いことを期待するかで、この多くの時間を費やす必要はありませんでした。任意のアイデアや考え?

感謝!!

役に立ちましたか?

解決 2

わかりましたので、代わりに(私たちの特定のケースでは無駄である)新しいはDB_Fileを作成する方法を考え出すのは、私だけの猿 - パッチを当てdestroy_fileだけに、それを指して、それ以上の取付けレコードがない場合はDB_Fileを削除します。あなたは誰かがその場で添付ファイルはDB_File を「修正」することを可能にする場合、これはの適切ではないかもしれないが、我々はしないので、これは素晴らしい作品ます。

Technoweenie::AttachmentFu::Backends::DbFileBackend.module_eval do
  protected
  def destroy_file
    if db_file && self.class.count( :conditions =>["id <> ? AND db_file_id = ?", self.id, db_file.id] ) == 0
      db_file.destroy 
    end
  end
end

他のヒント

このはbuild_db_fileコールを説明するだけのパーシャルレスポンスである

あなたが疑われるとして

build_db_fileコールは作成することによって生成されたメソッドを実行しますbelongs_toの関連付けがを。関連付けは、ここで作成されます:

def self.included(base) #:nodoc:
   Object.const_set(:DbFile, Class.new(ActiveRecord::Base)) unless Object.const_defined?(:DbFile)
   base.belongs_to  :db_file, :class_name => '::DbFile', :foreign_key => 'db_file_id'
end

だから、(db_file || build_db_file)文は、既存の関連するDbFileオブジェクトを受け取り、またはそれがnilだ場合は、新しいものを作成し、そのバイナリフィールドdataにtemp_dataを割り当てます。 temp_dataはおそらくフォームからのデータをバイト配列である。

そして、私は(私はあなたの質問にコメントすることはできません)一つの質問を持っている - なぜあなたは

とそれを作成した後db_file.save!を呼び出すことはありません
db_file = DbFile.new :data => temp_data

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top