2009-09-09 18 views
47

aparentemente dependiente => destroy se ignora cuando también se usa la opción: through.dependent => destroy en una asociación "has_many through"

así que tengo esto ...

class Comment < ActiveRecord::Base 
    has_many :comment_users, :dependent => :destroy 
    has_many :users, :through => :comment_users 
    ... 
end 

... pero la eliminación de un comentario no da lugar a los registros asociados comment_user ser eliminado.

¿Cuál es el enfoque recomendado, entonces, para eliminar en cascada al usar: a través de?

Gracias

Respuesta

96

parecer: dependiente no se pasa por alto!

El problema real era que estaba llamando al Comment.delete(id) que va directo a la base de datos, mientras que ahora uso Comment.destroy(id) que carga el objeto Comment y llama a destroy() en él. Esto toma el :dependent => :destroy y todo está bien.

+0

hecho! Tuve un problema similar, excepto que recibía errores de clave externa a pesar de que estaba usando 'dependent:: destroy'. El problema era que estaba usando 'obj.delete' en lugar de' obj.destroy' para que los dependientes no se eliminaran, por lo tanto, el error de integridad. –

11

La solución del póster original es válida, sin embargo, quería señalar que esto solo funciona si tiene una columna de identificación para esa tabla. Prefiero que mis tablas de muchos a muchos sean solo las dos claves foráneas, pero tuve que eliminar mi "id: falso" de la definición de la tabla de migración para conectar en cascada delete to work. Tener esta funcionalidad definitivamente compensa tener una columna de identificación en la mesa.

+0

¡Gracias! Acabo de pasar medio día tratando de resolverlo por mi cuenta. – Tintin81

+2

usted da mvp real – jed

5

Si usted tiene una asociación polimórfica, usted debe hacer lo @blogofsongs dicho pero con un atributo foreign_key así:

class User < ActiveRecord::Base 
    has_many :activities , dependent: :destroy, foreign_key: :trackable_id 
end 
Cuestiones relacionadas