多对多连接和关联

用户可以通过Clips Scaffold上传Clips Scaffold ,此剪辑属于Show和/或Album (显示控制器,相册控制器)。

用户可以拥有

  • 只有一个节目
  • 很多ALBUMS

    我想要完成的事情:

用户可以上传剪辑 ,这些剪辑可以附加到“ 显示”或/和“ 相册”

有关更详细的概述,请查看下图: 在此处输入图像描述

问题#1我不理解的是我必须使用的关联。 我目前的型号:

用户模型

 has_many :clips, dependent: :destroy has_one :show, dependent: :destroy has_many :albums, dependent :destroy 

剪辑型号belongs_to :user

显示模型belongs_to :user

专辑模型belongs_to :user

 --------------------------------------------------------------------------------- 

问题#2我不确定如何完成,当用户上传剪辑时,他可以将它附加(或分配)给一个节目或专辑。

我对Show做了什么(因为只有一个)只是在View页面上调用。

这意味着用户上传的每个剪辑都会出现在Show上。

哪个错了……

现在我有一个Show和一个专辑我必须让用户能够选择在哪里附加它(在他拥有的许多专辑之一,或他的节目)。

或者我应该使用一个解决方案,用户可以通过相册显示控制器上传剪辑(而不是通过单独的剪辑控制器

我真的需要一些帮助:)

您的问题#1是多态关联的教科书案例。

 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 

您可以在Rails指南中了解有关多态关联的更多信息。

现在针对您的问题#2,假设您按照上面链接的指南进行迁移,您的clips表中将有两个数据库字段:

  • attachable_id – 这是将要接收关联的ShowAlbum实例的id
  • attachable_type – 这是目标对象的类名,因此ShowAlbum

在上传表单中,您将显示节目和/或相册列表,并将id分配给attachable_id ,将类名分配给attachable_type

我建议只用一个类加载你的初始选择,然后在用户选择第二个选项的情况下用JavaScript替换它的内容。 像这样:

 <%= f.collection_select :attachable_type, [['Show'], ['Album']], :first, :first, { :selected => 'Show' }, { :include_blank => false } %> <%= f.collection_select :attachable_id, Show.all, :id, :name %> 

我认为除非有某些原因它们都必须属于用户,否则你可以通过更好地利用clip模型来简化这一过程。

将您的关系更改为:

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 

您可以通过使用clip.show使用clip.show和相册来clip.albums – 可以使用clip.albums.find(params[:id])调用单个相册