トップ «前の日記(2012/07/05 (木) ) 最新 次の日記(2012/07/07 (土) )» 編集 RSS feed

HsbtDiary


2012/07/06 (金) [長年日記]

東京に帰ってきた

1週間の福岡出張終わり。明日は岡山 Ruby 会議 01 に参加するために岡山に行きます。

[mongodb][mongoid][rails] Mongoid::Paranoia で論理削除になっているデータを画面に表示する奴

mongoid には、いわゆる論理削除を扱うために Mongoid::Paranoiaというものがある。

これはこれで中々良く出来ていて便利なんだけど、 Model.deletedModel.unscoped.all とかで引っ張ってきた削除済みも含む全てのデータを表示しようとすると、named_path に削除済みとなっているインスタンスを入れるとルーティングエラーで死んでしまうという問題がある。

何とか削除済みのデータも表示したり、編集したいと思い色々調べた結果、Mongoid::Paranoiadestroyed? を上書きしていることが原因で named_path がエラーとなっていることがわかった。ちょっとアレではあるけど下のように Mongoid::Paranoia がオーバーライドしているメソッドをさらにオーバーライドした。

  def remove(options = {})
    super
    @destroyed = false
  end

  def destroyed?
    @destroyed ||= false
  end

上のコードで Paranoia が持っている deleted_at を付加したり、default_scope を変更するのは維持しつつも、destroyed? は上書きする前の状態に戻って named_path が使えるようになる。とりあえず、これくらいが限界かなあ。