Home –  未分類 – Rails3で論理削除とかでアバババババ(;´Д`)

Rails3で論理削除とかでアバババババ(;´Д`)

最近Rails3を勉強しています。

んで、よくある事と言えばやはりDBからの削除で論理削除をしたかったりとか更新ユーザーを保存したかったりとかするのです。

そこで出てくるのがRailsの各種プラグイン類。
論理削除で言えばrails3_acts_as_paranoid
更新ユーザーを保存するのであればmagic_userstampというのがあるようです。

ああ、更新ユーザー保存するならユーザー認証の仕組みも必要ですね。ということでauthlogicを組み合わせました。

・・・・が、論理削除を行った際ですが、どうしてもdeleter_idにユーザーのIDが保存されません(;´Д`)
magic_userstampのドキュメントをみるとacts_as_paranoidには対応しているようです。
・・・・・はっ!これはRails2時代のものじゃないか(;´Д`)

で試行錯誤しながら数時間かかりました。わかった事と言えば。

  • magic_userstampはact_as_paranoidの有無の判別にはCaboose::Acts::Paranoidの存在をチェックしているらしい。
  • Caboose::Acts::Paranoidを適当に定義してもdeleter_idに保存されない。どうやら rails3_acts_as_paranoidとacts_as_paranoid仕組みが違うっぽい。
  • rails3_acts_as_paranoidは最終的にはdeleted_allのメソッドを置き換えてupdate_allを発行しているみたいだ。
ということがなんとなくわかりまして・・・・初心者ながら思ったのは。
「delete_all」を上書きすればいいんじゃね!
ということです。
また試行錯誤しながらこんなの書いてみました。
module ParanoidOnDeleterId
 def self.included(klass)
   klass.send :extend, ClassMethods
   klass.instance_eval do
     alias :delete_all_without_explain :delete_all
     alias :delete_all :delete_with_explain
   end
 end

 module ClassMethods
   def delete_with_explain(conditions = nil)
     if User.stamper.is_a?(Numeric)
       update_all ["#{paranoid_configuration[:column]} = ?, deleter_id = ?", delete_now_value, User.stamper], conditions
     else
       delete_all_without_explain(conditions)
     end
   end
 end
end

まぁ、英語よーわからんので名前付けが変っぽいのは許してください(;´Д`)
で該当するモデルに

class Hage < ActiveRecord::Base
  acts_as_paranoid
  MagicUserstamp.config.compatibles
  include ParanoidOnDeleterId
end

こんなこんな感じにしてみたらちゃんとdeleter_idに入りましたとさ。

その場しのぎ感がすごいですがこれでいいやw

コメントを残す