1週間の福岡出張終わり。明日は岡山 Ruby 会議 01 に参加するために岡山に行きます。
mongoid には、いわゆる論理削除を扱うために Mongoid::Paranoiaというものがある。
これはこれで中々良く出来ていて便利なんだけど、 Model.deleted
や Model.unscoped.all
とかで引っ張ってきた削除済みも含む全てのデータを表示しようとすると、named_path に削除済みとなっているインスタンスを入れるとルーティングエラーで死んでしまうという問題がある。
何とか削除済みのデータも表示したり、編集したいと思い色々調べた結果、Mongoid::Paranoia
が destroyed?
を上書きしていることが原因で named_path がエラーとなっていることがわかった。ちょっとアレではあるけど下のように Mongoid::Paranoia
がオーバーライドしているメソッドをさらにオーバーライドした。
def remove(options = {})
super
@destroyed = false
end
def destroyed?
@destroyed ||= false
end
上のコードで Paranoia が持っている deleted_at を付加したり、default_scope を変更するのは維持しつつも、destroyed?
は上書きする前の状態に戻って named_path が使えるようになる。とりあえず、これくらいが限界かなあ。