Search

検索したいワードを入力してください

2019年04月09日

Rails destroyの書き方とデータの削除方法を解説

Railsにおいてデータ削除する際には、物理削除と論理削除が存在します。物理削除は理解していても論理削除についてしっかりと理解していない方も多いのではないのでしょうか。この記事では、データの削除の仕方から論理削除の解説を行っていきます。ぜひ読んでみてください。

destroyとは

destroyとは、削除する際に使用するメソッドです。

Railsでアプリを開発する際に、必要となる場合が多い機能です。
この記事では、このdestroyについてや他のメソッドについて説明します。

基本的なdestroyの書き方

Railsにおいて、基本的なCRUDのControllerのdestroyメソッドについては以下のような書き方がされます。



class Controller < ApplicationController
before_action :set_data, only: [ :show, :edit , :update, :destroy]
/////略
def destroy
@model.destroy
end

private
/////略
def set_data
@model = モデル名.find(params[:id])
end
end


以上のコードでは、所々省略して削除機能について書きました。

Railsのdestroyを使ったデータの削除方法を解説

先ほどでは、Controllerに削除機能を書きました。次は、RailsConsoleを利用してデータの削除を行います。

データを削除する基本的な方法ですのでこの知識を身に着けるようにしましょう。

※consoleでデータを削除する時は誤って違うデータを削除しないように気をつけましょう。

destroyメソッドを試す為の事前準備

Railsアプリ作成とモデル作成

destroyメソッドを試すために事前準備を行います。
Railsアプリを作成してモデルを作ります。

ターミナルまたはコマンドプロンプトで以下のコマンドを打ちます。
$ rails new DestroyApp
$ rails g model item name:string age:integer price:integer
$ rails db:migrate

以上でRailsアプリが作成され、モデルも作成されました。

モデルにデータを追加

RailsConsoleを立ち上げて作成したモデルにcreateコマンドを使用してデータを追加していきます。

$ rails console

Item.create(name:"taro",age:20,price:1000)
Item.create(name:"rina",age:21,price:2000)
Item.create(name:"taku",age:22,price:3000)
Item.create(name:"mamoru",age:23,price:4000)


適当に4件のレコードを追加しました。

Item.allのコマンドを打って、実際にモデルにデータが追加されたか確認してみましょう。

データベースからデータを削除する方法

データベースからデータを削除する方法として4種類あります。

・destroyメソッド
・destroy_allメソッド
・deleteメソッド
・delete_allメソッド

実行の仕方としては、ターミナルまたはコマンドプロンプトでconsoleを立ち上げて、コマンドを打ちます。

以上のメソッドについて説明していきます。

destroyメソッドの使い方

destroyメソッドの構成は以下のようになっています。
モデル名.destroy(主キー値)
このコマンドで、指定された主キー値のデータが削除されます。

先ほど作成したモデルを使用して試してみましょう。

まずRailsConsoleを立ち上げます。
$ rails console

現在、テーブルに入っているデータを参照します。
Item.all
そうすると先ほど作成したデータが出てきます。
Item id: 1, name: "taro", age: 20, price: 1000, created_at: "2019-03-04 13:32:54", updated_at: "2019-03-04 13:32:54">, ~以下略


ここにあるitem idというのがそれぞれのデータの主キー値となります。
destroyメソッドではこの主キー値を指定してデータを削除します。

Item.destroy(1)

主キー値1番目のデータが削除されます。

destroy_allメソッドの使い方

destroy_allメソッドとは、特定の条件に合うデータをまとめて削除します。この特定の条件というのがwhereメソッドを使用して指定します。
構文は以下のとおりです。
モデル名.where(条件).destroy_all

先ほどの作成したモデルを使用して試してみます。
コンソール上で以下のコマンドを打ちます。
Item.where(id: 2..4).destroy_all

このコードでは、idが2~4までのデータを全て削除するといった処理を行っています。

Item.allのコマンドを打って、実際にデータが削除されたか確かめて見ましょう。

deleteメソッドの使い方

deleteメソッドとは、destroyメソッドと同じようにデータを一件削除するメソッドです。
しかしdestroyメソッドと違う点としては、関連するデータは削除されないことです。
deleteメソッドの制約を理解していないうちは、destroyメソッドを優先して利用しましょう。

deleteメソッドの構文は以下のとおりです。
モデル名.delete(主キー値)

先ほど作成したモデルで試してみましょう。
console上で以下のコマンドを打ちます。
※モデルにデータがない場合は、再びcreateコマンドでデータを追加して下さい。

Item.delete(5)

以上のコマンドで、idが5のデータが削除されます。
Item.allで実際に削除されたか確認してみましょう。

delete_allメソッドの使い方

delete_allメソッドとは、destroy_allメソッドと同じように特定の条件に合うデータをまとめて削除します。
この特定の条件というのがwhereメソッドを使用して指定します。
しかしdestroy_allメソッドと違う点としては、関連するデータは削除されないことです。

delete_allメソッドの構文は以下のとおりです。
モデル名.whrere(条件).delete_all

delete_allメソッドを先ほど作成したモデルで試してみましょう。
Item.where(id: 6..8).delete_all
このコードは、idが6~8のデータを削除しているといった処理を行なっています。

Item.allのコマンドを打って実際にデータが削除されたか確認してみましょう。

データベースからデータを論理削除する

データの削除機能として物理削除と論理削除があります。
物理削除とはデータベースからデータを完全に削除することであり、復元が不可能です。

一方、論理削除とは何でしょうか?
以下の記事ではその論理削除について解説してきます。

論理削除とは

論理削除とは、実際にデータを削除するのではなく、削除されたとみなす目印(フラッグ)と呼ばれるカラムを設定する事によりユーザには削除しているかのように振る舞うことができ、必要時には削除したデータは元の状態に戻せるものを指します。

物理削除とは違い、論理削除はどのような時に使用するのかと言うとサービスにおいてユーザーがサービスを退会した後も、システム上一定期間はユーザーのデータを保持しなければならない時などに使用できます。

Railsで論理削除を使用するためには

Railsにおいて論理削除を使用するためにはparanoiaと呼ばれるgemを実装することによって容易に論理削除を使用することができます。

次の項目からは'paranoia'について導入の手順と使用確認について説明していきます。

paranoiaの導入方法

導入環境:ruby '2.5.0' Rails '5.1.5' paranoia '2.4.1'

paranoiaを導入するためには、導入したい各自RailsアプリのGemfileに'paranoia'を追加します。
※各自モデルを作成しておいて下さい。

そしたら$ bundle iを行います。

ターミナルまたはコマンドプロンプトにて以下のコマンドを打ちます。(途中にモデル名を打つ)
$ bin/rails generate migration AddDeletedAtTo(モデル名) deleted_at:datetime:index

打ち終わったら以下のコマンドを打ちます。
$ rails db:migrate

そして追加したモデルに acts_as_paranoid を追加します。
class Client < ActiveRecord::Base
acts_as_paranoid

# ...
end


以上によってparanoiaの導入は終わりです。

paranoia使用確認

paranoiaを使用確認するためにconsoleを立ち上げます。
ターミナルまたはコマンドプロンプトで以下のコマンドを打ちます。
$ rails c

※元々作成したモデルにはデータを入れといてください。
console上にてdestroyを使用して削除します。
モデル名.destroy(1)と打ち、主キー値1番目のデータを消すようにします。

削除すると以下のログが出てきます。

<Item id: 1, name: "tata", age: 21, price: 1000, created_at: "2019-03-09 16:52:24", updated_at: "2019-03-09 16:52:42", deleted_at: "2019-03-09 16:52:42">]>

deleted_atにタイムスタンプが入り、物理削除ではなく論理削除になります。

削除したデータを確認する場合は、 モデル名.only_deletedを打ちます。

論理削除されたデータの復元の仕方

論理削除されたデータの復元の仕方は、モデル名.restore(id)です。
または、モデル名.restoreです。

大量のレコードを復元する場合は、以下のコマンドを打ちます。
モデル名.restore([id1, id2, ..., idN])

2分以内に削除されたレコード、およびそれらの依存的に破壊された関連したレコードだけを復元したい場合は、以下のコマンドを打ちます。
モデル名.restore(:recursive => true, :recovery_window => 2.minutes)

まとめ

いかがでしたか?

この記事では、Railsにおいて基本的なdestroyとdeleteの使い方を説明しました。
終盤では論理削除について説明しました。論理削除は、使用する場面も多いと思うので
勉強することを勧めます。

物理削除を使用する際は慎重にデータを選んで、本当にそのデータを削除するのか確認して削除してください。

パソコンは良いことも悪いことに関しても打ち込んだコマンドに対して、従順に処理を行って
くれます。ですので物理削除してしまったデータは復元することができないためデータを削除する際には気をつけてください。

【PR】多くの人がプログラミングを諦めてしまう理由をご存知ですか?



近年プログラミングを勉強する人が増えています。

プログラミング学習者の多くは独学から取り組もうとしますが、だいたい80%ほどは3ヶ月も続かずに諦めてしまいます。早い人は1日目で。

多くの人がプログラミングを独学しようとして諦める理由は、次の3つ。
●モチベーションが維持できない
●エラーの原因・解決方法が分からない
●どう学習すればよいか分からない

TechBoostというプログラミングスクールでは、みんなと一緒にプログラミングをするのでモチベーションの維持ができ、分からないことがあればマンツーマンで教えてくれ、徹底的に研究された初心者向けの教材が揃っています。

TechBoostを卒業後、実際にエンジニアとして転職した方もいるほど。

本気でプログラミングを学びたい方は、一度無料のカウンセリングでご相談ください。プログラミングを嫌いになる前に。

tech boostについて

オーダーメイド型の学習コンテンツを提供する「tech boost」 は、エンジニアのキャリア支援に特化したサービスを複数展開している株式会社Branding Engineerが運営しているプログラミングスクールです。最短3ヶ月間で、未経験から『プログラミングの基礎』、『実際に業務で必要となるスキル』、『今のトレンドとなっている知識』まで学べ、ご希望の方にはプロのキャリアアドバイザーによる就業支援を行うことができます。

tech boost卒業生インタビュー

tech boostの卒業生の声を聞きました。あなたがプログラミングを学びたい理由を、一度考えてみてください。
営業→Javaエンジニア→Rubyエンジニアと転向し、第一志望のFinTech企業で働く山下さん
元営業、ビジネスのわかるエンジニアを目指す菅原さん
サンフランシスコに交換留学し、シリコンバレーのVCでインターン中の梅本さん
予備校の営業から半年でエンジニア転職を果たした小田島さん

tech boostの口コミ



Related