Ruby on Rails でテーブルからすべてのデータを削除する


データベースを更新する必要がある場合、開発中に特定のテーブルからすべての行を削除する必要がある場合があります.

それは遅い🐢です.めちゃくちゃ遅い🐄.

Railsには、すべてを解決するための多くの小さなトリックがあります🌈(ただし、まだ適切に文書化されていません😂).

これを実現するにはいくつかの方法があります.最も遅い/怖い/悪いものから、最も単純でありながら強力なソリューションまでランク付けします.

さあ行こう !!!


3) データベース全体を削除し、再度起動します



これは、 rake:db:drop 、次に rake:db:setup で実現できます.

うーん、データベースを削除してから新しいデータベースを作成し、スキーマをロードして、シード データで初期化します.

遅くて高価!!! 🐢

2) destroy_all



各レコードをインスタンス化し、その #destroy メソッドを呼び出すことによって、レコードを破棄します.各オブジェクトのコールバックが実行されます (:dependent アソシエーション オプションを含む).

レコードがインスタンス化され、 before_removeafter_removebefore_destroy 、および after_destroy コールバックが呼び出されます.



# 1
Person.where(sex: "male").destroy_all # 😂

# 2
class Author < ActiveRecord::Base
  has_many :books
end

author.books.size # => 3
author.books
# => [
#       #<Book id: 1, name: "Sapiens", author_id: 1>,
#       #<Book id: 2, name: "The Artist's Way", author_id: 2>,
#       #<Book id: 3, name: "Remote", author_id: 3>
#    ]

author.books.destroy_all

author.books.size # => 0
author.books      # => []

Book.find(1) # => Couldn't find Book with id=1


Note: Instantiation, callback execution, and deletion of each record can be time consuming when you're removing many records at once. It generates at least one SQL DELETE query per record (or possibly more, to enforce your callbacks).



1) すべて削除 👑



関連付けやコールバックを気にせずに多数の行をすばやく削除したい場合は、代わりに delete_all を使用してください.

コンソールを起動し、モデルで delete_all を呼び出します.

% rails c
> Book.count
# => 1200 
> Book.delete_all
# => 1200
> Book.count
# => 0


最初にレコードをインスタンス化せずにレコードを削除するため、#destroy メソッドを呼び出したり、コールバックを呼び出したりしません.

これは、データベースに直接送信される単一の SQL DELETE ステートメントであり、 destroy_all よりもはるかに効率的です.

次の 2 点に注意する必要があります.

1- .delete_all メソッドはオブジェクトをインスタンス化しないため、コールバックを提供しません (before_* および after_destroy はトリガーされません).

2- 関係には注意してください.特に、関連付けで定義された :dependent ルールは適用されません.影響を受けた行数を返します.

Post.where(person_id: 5).where(category: ['Something', 'Else']).delete_all


どちらの呼び出しも、DELETE という 1 つのステートメントで、影響を受ける投稿を一度に削除します.

依存関係を破棄するか、before_* または after_destroy コールバックを呼び出す必要がある場合は、代わりに destroy_all メソッドを使用してください.

here の詳細

終わり


資力:

1 2 3 4 5 6 7