2010-05-10 9 views

Respuesta

18

Sí, no lo admite. See the docs. En general, habtm está destinado solo para casos muy simples y si comienza a necesitar cosas más complejas, debe cambiar al has_many :through.

73

Si desea mantener a la simple asociación has_and_belongs_to_many, se podría añadir lo siguiente:

class Person < ActiveRecord::Base 
    has_and_belongs_to_many :posts 
    before_destroy { posts.clear } 
end 

que despejará la tabla de unión de todas las entradas de ese person. Nota: Esto solo elimina los registros de la tabla de unión, no destruye el posts (lo cual tiene sentido si es una dirección bidireccional has_and_belongs_to_many porque el post podría ser referenciado por otra persons).

Pero suponiendo, desde su nombre (Person y Post) Me gustaría asumir que es probable que pueda salir con un Person has_many :posts y una Post belongs_to :person en cuyo caso se puede utilizar el :dependent => :destroy sobre la asociación has_many.

+1

¿Podría agregar cómo implementaría una acción 'dependent:: destroy' en una relación ** bidireccional **' has_and_belongs_to_ many'' que se vincula con el ** mismo modelo **? – JJD

+4

No estoy seguro si la sintaxis fue originalmente como esta respuesta, pero sé que en los rieles 4 se supone que es 'before_destroy {posts.clear}' – mkralla11

+1

Gracias, lo edité para ser 'before_destroy' –

1

Prueba esto:

class Person < ActiveRecord::Base 
    has_and_belongs_to_many :posts 
    before_destroy do 
    posts.each { |post| post.destroy } 
    end 
end 

No es necesario que posts.clear como Rails 4.2 y versiones posteriores se encarga de esto ya.

Cuestiones relacionadas