2009-09-10 7 views
5

Ho un modello in rotaia con una_a_molti rapporti. Quando cancello il padre, vorrei eliminare tutti i childrens. Come dovrei farlo? Voglio eliminare tutti gli ordini e le sue voci quando elimino un utenteCome posso effettuare una cancellazione a cascata in una relazione one_to_many in Rails ActiveRecord?

I miei modelli sono:

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 

risposta

9

di JDL è corretta - è necessario aggiungere :dependent => :destroy ad entrambe le relazioni - vale a dire nella classe User, aggiungerlo alla has_many :orders, e nella tua classe Order, aggiungerlo al has_many :order_items.

Si potrebbe anche voler modificare il comportamento MySQL delle chiavi esterne, magari impostandole su ON DELETE CASCADE.

+0

Hai entrambi ragione @jdl e @cite. Quello che stavo facendo male era che stavo chiamando il metodo delete oltre al metodo destroy. Ora tutto funziona bene –

+0

Corretto al 100% .. Grazie .. –

5

Quello che stai cercando è l'opzione :dependent => :destroy su has_many. risposta

has_many docs

+0

Ho provato, ma ottengo questo: Impossibile eliminare o aggiornare una riga padre: un vincolo di chiave esterna non riesce ('detam2' .order_items', CONSTRAINT' FKE3418DF1BA998374' FOREIGN KEY ('id_order') REFERENCES' orders' ('id')): DELETE da' orders' WHERE ('id' IN (31)) ActiveRecord :: StatementInvalid: Mysql :: Errore: impossibile eliminare o aggiornare una riga padre: un vincolo di chiave esterna non riesce (' detam2'. 'order_items', CONSTRAINT' FKE3418DF1BA998374' FOREIGN KEY ('id_order') REFERENZE' pedidos' ('id')): DELETE FROM' orders' WHERE ('id' IN (31)) –

+0

Hai entrambi ragione @jdl e @ citare. Quello che stavo facendo male era che stavo chiamando il metodo delete oltre al metodo destroy. Ora tutto funziona bene –