波打際のブログさん

主に、プログラミング備忘録など。

論理削除Gem、 Kakurenbo をアップデートしました。

様々なわけがあってkakurenboは非推奨です。新規のプロジェクトではkakurenbo-putiの使用をおすすめします。

Kakurenboとは

 Rails4で論理削除を実現するためのGemです。実装に至った経緯は Rails4と3で論理削除を行うためのGem Kakurenbo の紹介と今更論理削除Gemを実装した理由。 - 波打際のブログさん を見てください。

アップデート

 今回のアップデートの目的は、ActiveRecord4.0.2以降との親和性を向上させることにあります。主な変更点は次のとおりです。

メソッド名のコンフリクト解消

 yusabana (Yuji Takaesu) · GitHub さんから、 destroy! メソッドのコンフリクト修正とRspec3対応のプルリクエストをいただき、マージしました。

 従来の Kakurenbo で物理削除を行う場合、物理削除用のメソッド destroy! を呼び出していました。しかし、Rails4.0.2にdestroy!メソッドが追加されたため、メソッドがコンフリクトしてしまいました。解決策として、物理削除のメソッドを廃止してオプションで物理削除を指定する設計に変更しました。

 この変更に伴い全ての物理削除メソッドを廃止し、オプションで物理削除を指定する設計に変更しました。

リレーショナルの論理削除に完全対応

 従来の Kakurenbo はリレーショナルの論理削除に一部未対応でしたが、今回のアップデートで完全対応しました。

Rails3サポートの打ち切り

 Rails4の対応に十分な時間を割り当てるために0.2以降のバージョンでは、Rails3の対応を打ち切ります。

アソシエーションの強化(7月23日追記)

 belongs_toやhas_manyなどでレコードに関連付けされた他テーブルのレコードの読み込みを、近日リリース予定のバージョン0.2.1で強化します。具体的には、読み込み元のレコードが論理削除されていた場合に、関連付けされたレコードのスコープに依存削除されたレコードを含めるようにします。(完全対応はRails4.1以降のみで、Rails4.0.xではThroughアソシエーションには未対応となります。)

リファレンス

 今回のアップデートで Kakurenbo のインターフェイスは次のようになりました。

論理削除

 Railsの削除メソッド全てが論理削除に置き換えられます。

# コールバックあり
model.destroy
model.destroy!

Model.destroy_all(hoge: 'fuga')
Model.where(hoge: 'fuga').destroy_all

# コールバックなし
model.delete

Model.delete_all(foo: 'bar')
Model.where(foo: 'bar').delete_all
復元

 destroy!メソッドの挙動に合わせてrestore!メソッドを修正しました。コールバックなどで復元がキャンセルされた場合に例外が発生するようになります。

# コールバックあり
# before_restore, after_restore コールバックが利用可能です。
model.restore
model.restore!

Model.where(hoge: 'fuga').restore_all
物理削除

 物理削除は、削除系のメソッドにオプションで指定するようになりました。

# コールバックあり
model.destroy(hard: true)
model.destroy!(hard: true)

Model.destroy_all(hoge: 'fuga', hard: true)
Model.where(hoge: 'fuga').destroy_all(nil, hard: true)

# コールバックなし
model.delete(hard: true)

Model.delete_all(foo: 'bar', hard: true)
Model.where(foo: 'bar').delete_all(nil, hard: true)

 その他のメソッドや使い方は alfa-jpn/kakurenbo · GitHub を確認してください。

謝辞

 今回のアップデートに関して、プルリクエスト、バグレポートを送信していただいた下記の方々に心より御礼申し上げます。