2009-09-10 26 views
5

Tengo un modelo en rieles con una relación one_to_many. Cuando elimino al padre, me gustaría eliminar a todos los niños. ¿Cómo debería hacerlo? Quiero borrar todas las órdenes y sus artículos cuando se borra un usuario¿Cómo puedo hacer una eliminación en cascada en una relación one_to_many en Rails ActiveRecord?

Mis modelos son:

class User < ActiveRecord::Base 
    has_many :orders, :foreign_key => "id_user" 
end 

class Order < ActiveRecord::Base 
    has_many :order_items, :foreign_key => "id_pedido" 
    belongs_to :user, :foreign_key => "id_usuer" 
end 

class OrderItem < ActiveRecord::Base 
    belongs_to :order, :foreign_key => "id_pedido" 
end 

Respuesta

9

de JDL es correcto - es necesario agregar :dependent => :destroy a ambas relaciones - es decir, en su clase de User, añadirlo a has_many :orders, y en su clase Order, añadirlo a has_many :order_items.

Es posible que también desee cambiar el comportamiento de MySQL con las claves foráneas, quizás configurándolas en ON DELETE CASCADE.

+0

Ambos tienen razón @jdl y @cite. Lo que estaba haciendo mal era que estaba llamando al método de eliminación además del método de destrucción. Ahora todo funciona bien –

+0

Correcto 100% .. Gracias .. –

5

Lo que estamos buscando es la opción :dependent => :destroy en has_many. respuesta

has_many docs

+0

Lo intenté, pero entiendo esto: No se puede eliminar o actualizar una fila principal: falla una restricción de clave externa ('detam2' .order_items', CONSTRAINT' FKE3418DF1BA998374' FOREIGN KEY ('id_order') REFERENCES' orders' ('id')): ELIMINAR FROM' orders' WHERE ('id' IN (31)) ActiveRecord :: StatementInvalid: Mysql :: Error: No se puede eliminar o actualizar una fila padre: una restricción de clave foránea falla (' detam2'. 'order_items', CONSTRAINT' FKE3418DF1BA998374' FOREIGN KEY ('id_order') REFERENCES' pedidos' ('id')): ELIMINAR FROM 'orders' WHERE (' id' IN (31)) –

+0

Ambos tienen razón @jdl y @ citar. Lo que estaba haciendo mal era que estaba llamando al método de eliminación además del método de destrucción. Ahora todo funciona bien –

Cuestiones relacionadas