gemがあるRailsプロジェクトで物理削除する方法|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社エンジニアの「?」を「!」に。gemがあるRailsプロジェクトで物理削除する方法hachi8833シェアツイートブックマークLINEこんにちは、hachi8833です。gemが使われている場合に止むを得ず物理削除を行うための方法をメモします。記事末尾のコメントもご覧ください。paranoiaでの物理削除ActiveRecordオブジェクトで#really_destroy!を呼べば物理削除になります。clientそれ以外のdestroy系操作は期待どおり論理削除(実際には削除せず、隠すだけ)になります。:destroyレコードも物理削除されます。using.rubysherpas/paranoia確認したところ、paranoiaの#deleteで以下のメソッドがオーバーライドしているので、#deleteでは物理削除されなくなります。基本的な利用法もメモします。paranoiaのリポジトリそのまんまですが。モデル(ここではClient)でacts_as_paranoidを追加することで論理削除が有効になります。...end以後、このモデルのインスタンスでdeleted_atとdestroyを呼んでもdeleted_atタイムスタンプが追加されるだけで実際には削除されなくなります。'without_default_scope'を指定しているなどの理由でdefault_scopeが使えない場合向け論理削除済みのものだけ取り出す:Client.only_deleted論理削除済みかどうかのチェック方法(2種類):client.paranoia_destroyed?client.deleted?論理削除を取り消す方法(2種類)Client.restore(id)client.restoreコメントmorimorihogeです。付ける前に確認したいことで網羅されているので、投げる前にまずはこちらを参照しましょう。その上で議論する方がお互い有意義です。validationをくぐり抜けてSQLがエラーになったり、後から論理削除対応しようとするとdefault_scope周りで問題になったりで困ることが多いので、基本使わない派です。ブツリサクジョコワクナイヨただ、どこかの誰かが作ったコードが保守・引き継ぎで回ってくることまでは避けられないので辛みですね。db/schema.rbをとりあえず見たときにステータスっぽいフラグが大量にあるテーブルを見ると心が荒みます(フラグなのにbool以外な値が入ってる奴とかは特に)。ところでRailsではあまりRDBMSのVIEWを使わない文化な感じですが、複雑なscopeでフィルタリングされた条件を参照するときなんかはscopeよりもVIEWの方がシンプルじゃないかなあと思うことはあります。商品テーブル(products)があったときに「今販売可能な商品」という条件が「公開フラグがON」かつ「現在時刻が販売期間内含まれている」かつ「在庫がある」・・・(以下略)みたいなことは良くあると思うのですが、scopeで条件を作ってしまうとRailsコードからアクセスするのは便利なのですが、同等の条件を取り出すSQLが欲しい、となったときに色々不便です。こんな時「v_current_available_products」の様なVIEWを定義しておけば、何も考えずにVIEWから取り出すことができるんですよね。VIEWはSELECTする限りにおいては通常のテーブルと同じように使えますし。(DBのViewを作ったらRailsプログラムが綺麗になった話)。RailsでVIEWを扱う時はmigrationの絡みも出てきてまた違う辛みも出てくるので万人にオススメできるかというと辛いところもあるのですが、選択肢としてはアリだと思います。MySQLにはマテリアライズドビューがないので、VIEWを多用するようなプロジェクトではPostgreSQLを使うか、更新頻度がそう頻繁でなくて良ければ擬似的にマテリアライズドビュー相当のテーブルを作るということになります。(参考:MYSQLで疑似的なマテリアライズド・ビュー作成)いつの間にか話題がそれましたが、論理削除に限らずフラグやステータスについてはよくよく考えて行きたいものですね。コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。enno.jpを運営。実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。Storageを使ってはいけない(翻訳)#Tags#会社紹介#自社サービス#勉強会#Rails#PHP#デザイン#実績#週刊RailsウオッチCONTACTお気軽にご相談ください。(翻訳)CONTACTTechRachoでは、パートナーシップをご検討いただける方からのご連絡をお待ちしております。お気軽にご意見・ご相談ください。