LoginSignup
2
0

More than 3 years have passed since last update.

[Rails]deleteとdestroyの違い

Last updated at Posted at 2021-04-23

はじめに

最近、destroyとdeleteの違いを理解したフリしていたことに気づきました。
これはいかん!!ということで、ここに備忘としてアウトプットします。

deleteメソッド

条件に一致したレコードを、SQLを直接実行することで削除します。
つまり、モデルを経由せずに削除していて関連づけしているレコードは削除されないわけです。

余談ですが、フォロー機能実装中に、Relationshipモデル(中間テーブル)を削除したくてdestroy使ったらUserも消えて、、、deleteメソッドには助けられました。

destroyメソッド

destroyメソッドはモデルつまりActiveRecordを経由してるため、関連したバリデーション機能も有効ですし、関連づけされたレコードの削除も行われます。
ちなみに、こいつは削除に失敗したときに私が大好きなエラーは返してくれなくて、falseを返してくるので、エラーが欲しい人はdestroy!メソッドを使ってみてください。

余談;uniq!の違いとuniqメソッドの違い

題名とは全く異なる余談です。(destroyとdestroy!で思い出したついでに)
uniqとuniq!の違いについてですが、これは上述したdestroyのような違いとは異なります。

uniq!メソッドは破壊的メソッドと呼ばれていて、元配列をそのまま加工します。
一方、uniqメソッドは元の配列を保存したまま、別の配列を用意して処理を行います。

train = ["りんご", "りんご", "みかん", "ぶどう" ]
p train.uniq! #=>["りんご","みかん", "ぶどう" ]
p train      #=>["りんご","みかん", "ぶどう" ] 元には戻らない!

train = ["りんご", "りんご", "みかん", "ぶどう" ]

p train.uniq #=>["りんご","みかん", "ぶどう" ]
p train      #=>["りんご","りんご","みかん", "ぶどう" ] 元どおり!

終わりに

こうした小さな違いや基礎の部分を疎かにしてはいけないと、開発を通して感じました。応用よりも基礎、とにかく基礎を確実に定着させ、その上で応用、発展と成長していければと思いました。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0