web-dev-qa-db-ja.com

Railsでカスケード削除を設定できますか?

これはおそらくインターネット上のどこかにあることを知っていますが、ここでStackoverflowで答えを見つけることができないので、ここで知識ベースを少し上げることができると思いました。

私はRuby and Railsの初心者ですが、私の会社はかなり投資しているので、もう少し知りたいと思っています。詳細。

データベースからではなく「モデル」からアプリケーションを設計するように自分の考え方を変えることは困難だったので、データベースで従来行っていたすべての設計作業をどのように行うかを理解しようとしています。 Rails代わりにモデル。

したがって、私が自分に与えた最も最近のタスクは、カスケード削除を行うためにRailsデータベースモデルを設定する方法を見つけ出すことです。これを行う簡単な方法はありますか? MySqlにこれを設定しますか?

77
matt_dev

:dependentオプションを:delete_allに設定することもできます。 :delete_allは、すべての子レコードを削除する単一のSQLステートメントを発行します。このため:delete_allを使用すると、パフォーマンスが向上する場合があります。

has_many :memberships, dependent: :delete_all
94
Mike Breen

はい、できます

has_many :memberships, dependent: :destroy
64
danmayer

提供された答えに反して、データベースレベルでこれを行うことを強くお勧めします。異なるプロセスまたはマルチスレッド環境がある場合、レコードが適切に削除されないことがあります。さらに、データベースの外部キーにより、大量のデータを削除する際の処理が高速化されます。

提案された答えのようにこれを行います:

has_many :memberships, dependent: :delete_all

ただし、foreign_key移行中。そうすることで、データベースが自動的にレコードを削除します。

ユーザーモデルがあると仮定して、メンバーシップが削除されたときに値を無効にするには:

add_foreign_key :users, :memberships, on_delete: :nullify

メンバーシップが削除されるたびに、すべてのモデルを削除することもできます

add_foreign_key :users, :memberships, on_delete: :cascade
20
Hendrik

Delete_allは、子レコードに対してコールバック(before_destroyやafter_destroyなど)を実行しないことに注意してください。

10
Jarin Udom

カスケード削除を実際のデータベース構造に反映させたい場合、このプラグインが探しているものを提供するように見えます:

http://www.redhillonrails.org/foreign_key_migrations.html

移行でこれを使用するための形式は次のようになります。

create_table :orders do |t|
  t.column :customer_id, :integer, :on_delete => :set_null, :on_update => :cascade
  ...
end
6
Sean McMains