多对多连接和关联

时间:2013-09-14 12:43:48

标签: ruby-on-rails associations ruby-on-rails-4 rails-activerecord polymorphic-associations

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

用户可以拥有

  • 只有一个节目
  • 多个ALBUMS

    我想要完成的事情:

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

有关更详细的概述,请查看下图: enter image description here

问题#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%>在视图页面上。

这意味着用户上传的每个剪辑都会显示在“显示”

哪个错误......

现在我有一个显示相册我必须让用户能够选择来附加它(在其中一个他有很多专辑,或者他的演出。)

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

我真的需要一些帮助:)

2 个答案:

答案 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 - 这是将要接收关联的idShow实例的Album
  • 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 %>

答案 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])

调用单个相册