用户可以通过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 我不确定如何完成,当用户上传剪辑时,他可以将其附加(或分配)到节目或专辑。
我使用显示(因为只有一个)所做的只是调用<%= @ user.clip%>在视图页面上。
这意味着用户上传的每个剪辑都会显示在“显示”
上哪个错误......
现在我有一个显示和相册我必须让用户能够选择来附加它(在其中一个他有很多专辑,或者他的演出。)
或者我应该使用一个解决方案,用户可以通过相册或显示控制器上传剪辑(而不是通过单独的剪辑控制器)
我真的需要一些帮助:)
答案 0 :(得分:1)
您的问题#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 Guides了解有关多态关联的更多信息。
现在针对您的问题#2,假设您按照上面链接的指南进行迁移,您的clips
表中将有两个数据库字段:
attachable_id
- 这是将要接收关联的id
或Show
实例的Album
。 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 %>
答案 1 :(得分:0)
我认为除非有某些原因它们都必须属于用户,否则您可以通过更好地使用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.albums
查看相册 - 可以使用clip.albums.find(params[:id])