Ruby on Rails でテーブルからすべてのデータを削除する
データベースを更新する必要がある場合、開発中に特定のテーブルからすべての行を削除する必要がある場合があります.
それは遅い🐢です.めちゃくちゃ遅い🐄.
Railsには、すべてを解決するための多くの小さなトリックがあります🌈(ただし、まだ適切に文書化されていません😂).
これを実現するにはいくつかの方法があります.最も遅い/怖い/悪いものから、最も単純でありながら強力なソリューションまでランク付けします.
さあ行こう !!!
これは、
うーん、データベースを削除してから新しいデータベースを作成し、スキーマをロードして、シード データで初期化します.
遅くて高価!!! 🐢
各レコードをインスタンス化し、その
レコードがインスタンス化され、
例
関連付けやコールバックを気にせずに多数の行をすばやく削除したい場合は、代わりに
コンソールを起動し、モデルで
最初にレコードをインスタンス化せずにレコードを削除するため、
これは、データベースに直接送信される単一の SQL
次の 2 点に注意する必要があります.
1-
2- 関係には注意してください.特に、関連付けで定義された
どちらの呼び出しも、
依存関係を破棄するか、
here の詳細
終わり
資力:
1 2 3 4 5 6 7
それは遅い🐢です.めちゃくちゃ遅い🐄.
Railsには、すべてを解決するための多くの小さなトリックがあります🌈(ただし、まだ適切に文書化されていません😂).
これを実現するにはいくつかの方法があります.最も遅い/怖い/悪いものから、最も単純でありながら強力なソリューションまでランク付けします.
さあ行こう !!!
3) データベース全体を削除し、再度起動します
これは、
rake:db:drop
、次に rake:db:setup
で実現できます.うーん、データベースを削除してから新しいデータベースを作成し、スキーマをロードして、シード データで初期化します.
遅くて高価!!! 🐢
2) destroy_all
各レコードをインスタンス化し、その
#destroy
メソッドを呼び出すことによって、レコードを破棄します.各オブジェクトのコールバックが実行されます (:dependent
アソシエーション オプションを含む).レコードがインスタンス化され、
before_remove
、 after_remove
、 before_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
Reference
この問題について(Ruby on Rails でテーブルからすべてのデータを削除する), 我々は、より多くの情報をここで見つけました https://dev.to/asyraf/deleting-all-data-from-a-table-in-ruby-on-rails-39heテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol