15

Paperclipでビデオが添付されたモデルがあります。保存した後、保存したビデオを使用してサムネイルを生成します。ユーザーはサムネイルがキャプチャされる時間を変更できるため、新しいビデオがアップロードされていない場合でも、保存するたびにこれを行う必要があります。

現在、これを行うために after_post_process を使用していますが、ファイルをアップロードするときにのみサムネイルを生成します (これは Paperclip の一部であるコールバックです)。

理想的には、次のような after_save コールバックを使用します。

after_save :save_thumbnail
def save_thumbnail
  #generate thumbnail...
  self.update_attributes(
    :thumbnail_file_name => File.basename(thumb), 
    :thumbnail_content_type => 'image/jpeg'
  )
end

残念ながら、update_attributes は save を呼び出し、次に before_save コールバックを呼び出して無限ループを引き起こします。この動作を回避する簡単な方法はありますか?

4

5 に答える 5

9

次のような条件付きでラップできます。

def save_thumbnail
  if File.basename(thumb) != thumbnail_file_name
    self.update_attributes(
      :thumbnail_file_name => File.basename(thumb), 
      :thumbnail_content_type => 'image/jpeg'
    )
  end
end

そうすれば、1回だけ実行されます。

于 2011-07-13T15:23:18.540 に答える
8

レール 2:

Model.send(:create_without_callbacks)
Model.send(:update_without_callbacks)

レール 3:

Vote.skip_callback(:save, :after, :add_points_to_user)

この質問を参照してください:

ActiveRecord コールバックをスキップするには?

于 2011-07-13T15:30:34.653 に答える
2

サムネイルを実際に更新する必要があるかどうかを確認できます(また、確認する必要があります)。

after_save :save_thumbnail
def save_thumbnail
  if capture_time_changed? #assuming capture_time contains time when the thumbnail has to be captured
    #generate thumbnail...
    self.update_attributes(
      :thumbnail_file_name => File.basename(thumb), 
      :thumbnail_content_type => 'image/jpeg'
    )
  end
end

ここでは、「ダーティ」属性について詳しく読むことができます:http: //apidock.com/rails/ActiveRecord/Dirty

それでもafter_saveで属性の変更を確認できるかどうかはわかりませんが。メンバー変数を使用して、変更できない場合に変更を示すことができます。

于 2011-07-13T15:41:47.293 に答える
0

代わりに実行できますbefore_save

検証が完了したら、サムネイルを更新して保存しますが、割り当て方法を使用するだけです

before_save :save_thumbnail
def save_thumbnail
  self.thumbnail_file_name = File.basename(thumb), 
  self.thumbnail_content_type = 'image/jpeg'
end

これは save を呼び出さないため、再帰はしませんが、メソッドが終了するとすぐに保存されます。

保存後に必要な明確な理由がない限り、そのようなものは機能するはずです。

別のオブジェクトを更新するのではなく、同じオブジェクトを更新するため、データベース呼び出しも節約できます。これは、タイムスタンプやそのようなことも行う方法です。

于 2011-07-13T15:26:32.267 に答える