読者です 読者をやめる 読者になる 読者になる

ActsAsParanoid+CarrierWave使用時で論理削除した際に画像ファイルを消さないようにする

Rails

ActsAsParanoidを使用してdestoryをコールするとレコードを論理削除してくれるのですが、
CarrierWaveで指定しているafter_destoryのコールバックが実行されてしまい画像が消えてしまいます。
今回は、論理削除する際に画像を残したかったので調べました。

githubのissuesに同じような場面についての対応が記載されていたのでこれでOKでした。

ORMはActiveRecordを使っているので下記の部分でコールバックが記述されています。
carrierwave-0.6.2/lib/carrierwave/orm/activerecord.rb

 27       after_save :"store_#{column}!"
 28       before_save :"write_#{column}_identifier"
 29       after_destroy :"remove_#{column}!"
 30       before_update :"store_previous_model_for_#{column}"
 31       after_save :"remove_previously_stored_#{column}"

after_destroyでコールしているメソッドが画像ファイルを消しているメソッドです。
columnというのはModel側でmount_uploaderに指定している物ですね。

mount_uploader :image, ImageUploader

上記のように定義しているのであればremove_image!が実行されることになります。

画像ファイルを残すようにするにはコールバックを実行しなければよいのでskip_callbackを使います。

mount_uploader :image, ImageUploader
skip_callback :destroy, :after, :remove_image!

目的の論理削除した際に画像ファイルを消さないようにする。を達成することができました。

ただ、物理削除した際の扱いなどについてはなにも対応できていないので実運用する上で考えるべきことはまだあります。