ruby on rails - polimorficas - Conexión y asociaciones de muchos a muchos
asociaciones polimorficas rails (2)
Creo que a menos que haya alguna razón por la que todos ellos deben pertenecer al usuario, puede simplificarlo mucho haciendo un mejor uso de su modelo de clip
.
Cambia tus relaciones a esto:
User.rb
has_many :clips, dependent: :destroy
Clip.rb
belongs_to :user
has_one :show
has_many :albums
Show.rb
belongs_to :clip
Album.rb
belongs_to :clip
Puede ver el programa usando clip.show
y los álbumes usando clip.albums
: se pueden llamar álbumes individuales usando clip.albums.find(params[:id])
Un usuario puede cargar un clip a través del Clips Scaffold
, este clip pertenece a un Show
y / o un Album
(Show Controller, Album Controller).
Un usuario puede tener
- SOLO UN SHOW
MUCHOS ÁLBUMES
Lo que estoy tratando de lograr:
Un usuario puede cargar clips , estos clips se pueden adjuntar a un Show o / y un álbum
Para una descripción más detallada, eche un vistazo a la imagen a continuación:
Problema n. ° 1 Lo que no entiendo son las asociaciones que debo usar. Mis modelos actuales:
Modelo de usuario :
has_many :clips, dependent: :destroy
has_one :show, dependent: :destroy
has_many :albums, dependent :destroy
Clip Model : belongs_to :user
Mostrar modelo : belongs_to :user
Modelo de álbum : belongs_to :user
---------------------------------------------------------------------------------
Problema n. ° 2 No estoy seguro de cómo lograr que cuando un usuario cargue un Clip, pueda adjuntarlo (o asignarlo) a un Show o Album.
Lo que hice con el Show (porque solo hay uno) fue simplemente llamar a <% = @ user.clip%> en la página de visualización.
Eso significa que cada clip que un usuario carga aparece en el Show.
Cuál está mal...
Ahora que tengo Show y un álbum, debo darle al usuario la capacidad de elegir dónde adjuntarlo (en uno de los muchos álbumes que tiene, o en su Show).
¿O debería ir con una solución donde el usuario puede cargar un clip A TRAVÉS de los álbumes o el controlador Mostrar (no a través del controlador de clips por separado)
Realmente podría necesitar ayuda aquí :)
Su problema n. ° 1 es un caso de libro de texto de asociación polimórfica.
class User < ActiveRecord::Base
has_one :show,
:dependent => :destroy
has_many :clips,
:dependent => :destroy
has_many :albums,
:dependent => :destroy
end
class Clip < ActiveRecord::Base
belongs_to :user
belongs_to :attachable,
:polymorphic => true
end
class Show < ActiveRecord::Base
belongs_to :user
has_many :clips,
:as => :attachable
end
class Album < ActiveRecord::Base
belongs_to :user
has_many :clips,
:as => :attachable
end
Puede obtener más información sobre asociaciones polimórficas en Rails Guides .
Ahora para su problema n. ° 2, suponiendo que haga sus migraciones según la guía vinculada anteriormente, tendrá dos campos de base de datos en su tabla de clips
:
-
attachable_id
- Esta es laid
de la instancia deShow
oAlbum
que va a recibir la asociación. -
attachable_type
: este es el nombre de clase del objeto de destino, por lo tanto,Show
oAlbum
.
En su formulario de carga, mostrará una lista de espectáculos y / o álbumes y asignará el id
a attachable_id
y el nombre de clase a attachable_type
.
Sugiero cargar su selección inicial con solo una clase y luego reemplazar su contenido a través de JavaScript en caso de que el usuario seleccione la segunda opción. Al igual que:
<%= f.collection_select :attachable_type, [[''Show''], [''Album'']], :first, :first, { :selected => ''Show'' }, { :include_blank => false } %>
<%= f.collection_select :attachable_id, Show.all, :id, :name %>