2011-01-30 18 views
5

Digamos que tengo dos modelos, Director y Película, y un modelo de tercera combinación llamado Direcciones. Se definen como tales:Creando o actualizando asociación con has_many: a través de

Película:

class Movie < ActiveRecord::Base 
    has_many :directions 
    has_many :directors, :through => :directions 
end 

Directora:

class Director < ActiveRecord::Base 
    has_many :directions 
    has_many :movies, :through => :directions 
end 

llegar:

class Direction < ActiveRecord::Base 
    belongs_to :movie 
    belongs_to :director 
end 

Cuando Creo una película. Deseo poder crear un director con la información suministrada (nombre e imdb_id) o encontrar un director existente basado en imdb_id y asociarlo con el registro de la película.

Esencialmente, no quiero borrar o editar un director, nunca. Solo quiero poder crear un nuevo director si no existe en base a su imdb_id, o asociarme con un director preexistente cuando estoy creando o editando una película.

Mi pregunta es, ¿cómo puedo vincular todo esto en la vista/controlador?

accepts_nested_attributes_for funciona bien, excepto en realidad se puede editar el nombre del director cuando se está editando una película de la que no quiero. No tengo ningún interés en actualizar/destruir a los directores reales, solo las asociaciones.

Respuesta

3

Su instancia de película tiene una matriz director_id que contiene los identificadores de las relaciones. Para que pueda fácilmente la lista de todos los directores, por ejemplo, que las casillas de verificación y pedir al usuario comprobar las relaciones ...

<% Director.all.each do |director| %> 
    <%= check_box_tag 'movie[director_ids][]', director.id, @movie.directors.include?(director) %> 
    <%= director.name # or whatever (title, etc) %> 
<% end %> 

<%= hidden_field_tag 'movie[director_ids][]', '' %> 

(el hidden_tag es cuando el usuario desactive todas las casillas, de manera que director_ids estarán vacías.)

+0

Gracias, eso me lleva a la mitad. Eventualmente tendré bastantes directores (en los cientos), por lo que mostrarlos no funcionará, pero puedo arreglarlo con alguna magia de búsqueda AJAX que está bien. Tengo un caso de uso específico en mente que no estoy seguro de cómo implementarlo. Digamos que creo una película con Steven Spielberg como director. Entonces me doy cuenta de que no lo dirigió en realidad, pero James Cameron lo hizo y aún no tengo a James Cameron en el DB. Con su solución podría desmarcar a Steven Spielberg, pero ¿cómo agregaría a James Cameron y crearía el registro y la asociación del Director DB? Gracias! –

Cuestiones relacionadas