HABTM y accept_nested_attributes_for

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

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 existen.

También quiero hacer lo mismo con el formulario de autor: agregar nombres de libros y enviarlos, vincularlos si existen o crearlos si no existen.

Sin embargo, en la edición, no quiero poder editar ni eliminar los objetos nesteds, solo eliminar las asociaciones.

¿Acepta a_nombre_atributos_para_Atributos para esto, o hay otra forma?

Logré lograr esto siguiendo las líneas de Rails de Complex Forms en Rails 2, pero estoy buscando una solución más elegante para Rails 3.

No estoy seguro de por qué tanta gente usa has_and_belongs_to_many , que es una reliquia de Rails 1, en lugar de has_many ..., :through excepto que probablemente se encuentra en muchos libros de referencia y tutoriales antiguos. La gran diferencia entre los dos enfoques es que el primero utiliza una clave compuesta para identificarlos, el segundo es un modelo de primera clase.

Si redefine su relación, puede administrar en el nivel de modelo intermedio. Por ejemplo, puede agregar y eliminar registros de has_and_belongs_to_many lugar de enlaces has_and_belongs_to_many que son muy difíciles de modificar individualmente.

Puedes crear un modelo simple:

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

Cada uno de sus otros modelos ahora se vincula más fácilmente:

 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 formulario nested, administre la relación book_authors directamente, agregando y eliminando aquellos según sea necesario.