Sé que esto probablemente esté en Internet en algún lugar, pero no puedo encontrar la respuesta aquí en Stackoverflow, así que pensé que podría aumentar un poco la base de conocimientos aquí.
Soy un novato en Ruby and Rails, pero mi empresa está invirtiendo bastante en eso, así que estoy tratando de conocerlo con un poco más de detalle.
Ha sido difícil para mí cambiar mi forma de pensar para diseñar una aplicación desde el "modelo" en lugar de desde la base de datos, así que estoy tratando de averiguar cómo haría todo el trabajo de diseño que he realizado clásicamente en la base de datos en el En su lugar, modelo de rieles.
Entonces, la tarea más reciente que me he encomendado es descubrir cómo configurar un modelo de base de datos Rails para realizar eliminaciones en cascada. ¿Hay una manera fácil de hacer esto? ¿O tendría que ir a MySql y configurar esto?
fuente
:delete_all
y:destroy
para esto. Ambos harán que las membresías secundarias (1 nivel para eliminar [cita requerida] yn
para destruir (si sus hijos tienen destrucciones dependientes)) se eliminen de la base de datos, pero:destroy
crearán una instancia de cada objeto secundario y ejecutarán las devoluciones de llamada primero, mientras:delete_all
que ejecutarán directamente una Sentencia SQL DELETE en la base de datos.:destroy
es más lento debido a eso, pero le permite tener devoluciones de llamada cuando se destruye un registro. Eludir rieles en un extremo y potencial instanciación n ^ x en el otro.Sí, puedes, si estás usando una relación como has_many, haz esto
has_many :memberships, dependent: :destroy
fuente
Al contrario de la respuesta proporcionada, sugiero encarecidamente hacer esto también a nivel de base de datos. En caso de que tenga diferentes procesos o un entorno de subprocesos múltiples, podría suceder que los registros no se eliminen correctamente. Además, la clave externa de la base de datos hace que las cosas sean mucho más rápidas al eliminar muchos datos.
Como en la respuesta sugerida, haga esto:
has_many :memberships, dependent: :delete_all
Sin embargo, también asegúrese de configurar
foreign_key
una migración. De esa forma, la base de datos se encarga de eliminar los registros automáticamente.Para anular los valores cuando se elimina una membresía, asumiendo que tiene un modelo de usuario:
add_foreign_key :users, :memberships, on_delete: :nullify
También puede eliminar todos los modelos siempre que se elimine una membresía
add_foreign_key :users, :memberships, on_delete: :cascade
fuente
delete_all
en el modelo. La clave externa se encargará de eliminar todo correctamente por usted a nivel de base de datos.Solo tenga en cuenta que delete_all no ejecutará ninguna devolución de llamada (como before_destroy y after_destroy) en los registros secundarios.
fuente
Parece que este complemento podría brindarle lo que está buscando si desea que las eliminaciones en cascada se reflejen en la estructura real de la base de datos:
http://www.redhillonrails.org/foreign_key_migrations.html
El formato para usar esto en una migración sería algo como esto:
create_table :orders do |t| t.column :customer_id, :integer, :on_delete => :set_null, :on_update => :cascade ... end
fuente