1. ホーム
  2. ruby-on-rails

[解決済み】delete_allとdestroy_allは?

2022-04-12 06:39:32

質問

テーブルからレコードを削除するための最良の方法を探しています。例えば、私はユーザーIDが多くのテーブルにわたっているユーザーを持っています。私はこのユーザーと、すべてのテーブルで彼のIDを持つすべてのレコードを削除したい。

u = User.find_by_name('JohnBoy')
u.usage_indexes.destroy_all
u.sources.destroy_all
u.user_stats.destroy_all
u.delete

これはうまくいって、すべてのテーブルからユーザーのすべての参照を削除するのですが、私は destroy_all は非常に処理が重いので delete_all . これは、そのユーザーを自分のユーザーテーブルから削除するだけで、そのユーザーの id のレコードはすべてnullにされますが、他のテーブルのレコードはそのまま残ります。どなたか、このようなタスクを実行するための正しいプロセスを教えていただけませんか?

なるほど destroy_alldestroy 関数が関連するすべてのオブジェクトに適用されますが、正しい方法を確認したいだけです。

どのように解決するのですか?

おっしゃるとおりです。ユーザーと関連するオブジェクトをすべて削除したい場合 -> destroy_all しかし、関連するすべてのオブジェクトを抑制せずに、ユーザーだけを削除したい場合 -> delete_all

この投稿によると: Rails :dependent => :destroy VS :dependent => :delete_all

  • destroy / destroy_all : 関連するオブジェクトは、そのdestroyメソッドを呼び出すことで、このオブジェクトと一緒に破棄されます。
  • delete / delete_all : 関連するすべてのオブジェクトは、その :destroy メソッドを呼び出すことなく直ちに破棄されます。