2011-02-07 11 views
9

Digamos que tengo dos modelos, Libro y Autor con una relación has_and_belongs_to_many entre ellos.HABTM y accept_nested_attributes_for

Lo que quiero hacer es poder agregar nombres de autores en el formulario del libro, y enviarlos para vincular a los autores con el libro si ya existen, o crearlos si no lo hacen.

También quiero hacer lo mismo con el formulario del autor: agregar nombres de libros y al enviarlos, vincúlelos si existen o créelos si no existen.

En la edición, sin embargo, no quiero ni editar ni eliminar los objetos anidados, solo eliminar las asociaciones.

¿Es acceptable_nested_attributes_for adecuado para esto, o hay otra manera?

me las arreglé para lograr esto siguiendo las Complex Forms Railscasts sobre raíles 2, pero yo estoy buscando una solución más elegante para rieles 3.

+0

http://stackoverflow.com/a/12961298/1446551 –

Respuesta

12

No estoy seguro de por qué tantas personas usan has_and_belongs_to_many, que es una reliquia de Rails 1, en lugar de usar has_many ..., :through, excepto que probablemente esté en muchos libros de consulta y tutoriales antiguos. La gran diferencia entre los dos enfoques es que el primero usa una clave compuesta para identificarlos, el segundo es un modelo de primera clase.

Si redefine su relación, puede gestionar en el nivel de modelo intermedio. Por ejemplo, puede agregar y eliminar registros BookAuthor en lugar de has_and_belongs_to_many enlaces que son notoriamente difíciles de ajustar de forma individual.

Se puede crear un modelo simple:

class BookAuthor < ActiveRecord::Base 
    belongs_to :book 
    belongs_to :author 
end 

Cada uno de los otros modelos es ahora más fácil ligados entre sí:

class Book < ActiveRecord::Base 
    has_many :book_authors 
    has_many :authors, :through => :book_authors 
end 

class Author < ActiveRecord::Base 
    has_many :book_authors 
    has_many :books, :through => :book_authors 
end 

En su forma anidada, gestionar la relación book_authors directamente, agregar y quitar aquellos según sea necesario.

+0

Gracias. Tomé este enfoque y es mucho más fácil de implementar que cualquier otra cosa. – Marjan

+32

La razón por la que las personas usan HABTM en has_many: through se debe a que no todas las tablas de unión muchas-a-muchas requieren un modelo para administrarla. No es raro que un modelo de datos complejo tenga muchas tablas de combinación que no hacen más que expresar la relación entre otras dos tablas. –

+0

El nombre solo es motivo suficiente para que HABTM muera, pero hay otros. Por un lado, no puede usar 'anidados_ atributos_para' con HABTM, por lo que agregar o quitar cosas con casillas de verificación es un ejercicio de frustración con el método anterior. Incluso si no necesita todas las características que el enfoque ': through 'tiene para ofrecer, si hay una pequeña posibilidad de que * will *, vale la pena usar. No puedo pensar en ninguna razón para usar HABTM específicamente y no lo he usado desde Rails 1.x. – tadman

Cuestiones relacionadas