はじめに
最近、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 #=>["りんご","りんご","みかん", "ぶどう" ] 元どおり!
#終わりに
こうした小さな違いや基礎の部分を疎かにしてはいけないと、開発を通して感じました。応用よりも基礎、とにかく基礎を確実に定着させ、その上で応用、発展と成長していければと思いました。