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!
目的の論理削除した際に画像ファイルを消さないようにする。を達成することができました。
ただ、物理削除した際の扱いなどについてはなにも対応できていないので実運用する上で考えるべきことはまだあります。