rails polimorficas asociaciones ruby-on-rails associations ruby-on-rails-4 rails-activerecord polymorphic-associations

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 la id de la instancia de Show o Album que va a recibir la asociación.
  • attachable_type : este es el nombre de clase del objeto de destino, por lo tanto, Show o Album .

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 %>