多对多连接和关联
用户可以通过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
– 这是将要接收关联的Show
或Album
实例的id
。 -
attachable_type
– 这是目标对象的类名,因此Show
或Album
。
在上传表单中,您将显示节目和/或相册列表,并将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])
调用单个相册