これはおそらくインターネット上のどこかにあることを知っていますが、ここでStackoverflowで答えを見つけることができないので、ここで知識ベースを少し上げることができると思いました。
私はRuby and Railsの初心者ですが、私の会社はかなり投資しているので、もう少し知りたいと思っています。詳細。
データベースからではなく「モデル」からアプリケーションを設計するように自分の考え方を変えることは困難だったので、データベースで従来行っていたすべての設計作業をどのように行うかを理解しようとしています。 Rails代わりにモデル。
したがって、私が自分に与えた最も最近のタスクは、カスケード削除を行うためにRailsデータベースモデルを設定する方法を見つけ出すことです。これを行う簡単な方法はありますか? MySqlにこれを設定しますか?
:dependentオプションを:delete_allに設定することもできます。 :delete_allは、すべての子レコードを削除する単一のSQLステートメントを発行します。このため:delete_allを使用すると、パフォーマンスが向上する場合があります。
has_many :memberships, dependent: :delete_all
はい、できます
has_many :memberships, dependent: :destroy
提供された答えに反して、データベースレベルでこれを行うことを強くお勧めします。異なるプロセスまたはマルチスレッド環境がある場合、レコードが適切に削除されないことがあります。さらに、データベースの外部キーにより、大量のデータを削除する際の処理が高速化されます。
提案された答えのようにこれを行います:
has_many :memberships, dependent: :delete_all
ただし、foreign_key
移行中。そうすることで、データベースが自動的にレコードを削除します。
ユーザーモデルがあると仮定して、メンバーシップが削除されたときに値を無効にするには:
add_foreign_key :users, :memberships, on_delete: :nullify
メンバーシップが削除されるたびに、すべてのモデルを削除することもできます
add_foreign_key :users, :memberships, on_delete: :cascade
Delete_allは、子レコードに対してコールバック(before_destroyやafter_destroyなど)を実行しないことに注意してください。
カスケード削除を実際のデータベース構造に反映させたい場合、このプラグインが探しているものを提供するように見えます:
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