【问题标题】:Many-to-many connection and Associations多对多连接和关联
【发布时间】:2013-09-14 12:43:48
【问题描述】:

用户可以通过Clips Scaffold 上传剪辑,此剪辑属于ShowAlbum(显示控制器、专辑控制器)。

用户可以拥有

  • 只有一场演出
  • 许多专辑

    我想要完成的事情:

用户可以上传剪辑,这些剪辑可以附加到节目或/和专辑

如需更详细的概述,请查看下图:

问题 #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 Page 上调用 。

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

哪里不对……

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

或者我应该采用用户可以通过 专辑显示 控制器上传剪辑的解决方案(而不是通过单独的 剪辑控制器)

我真的需要一些帮助 :)

【问题讨论】:

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


    【解决方案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 - 这是将接收关联的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 %>
    

    【讨论】:

    • 听起来很对 :),这就是问题 #1,关联。您提供的内容非常准确和正确。谢谢你。问题 #2 实际上是如何将剪辑(当用户上传时)分配给节目或特定专辑。这意味着代码(例如 f.select),
    • 我不确定我是否理解您所说的如何分配剪辑是什么意思,但我试图在我更新的答案中回答它。如果您对此仍有疑问,能否更具体一点?
    • 对不起,我的意思是我的 _form.html.erb 文件中的实际代码。上传剪辑的表格。用户如何选择这个剪辑属于哪个专辑,或者在一个节目中。必须有一些 f.select(或类似的东西)让他在他的专辑或他的节目中进行选择。
    • 呃.. 我想我明白你在告诉我什么,但我并没有真正明白。你能解释一下我必须为 attachable_type 做的迁移吗? rails g 迁移 AddAttachableTypeToClips attachable_type:string ?
    • 对于实际迁移,请查看我链接到的 Rails 指南页面。我可以将其发布在我的答案中,但我只是从文档中复制它。
    【解决方案2】:

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

    把你的关系改成这样:

    用户.rb

    has_many :clips, dependent: :destroy
    

    剪辑.rb

    belongs_to :user
    has_one :show
    has_many :albums
    

    显示.rb

    belongs_to :clip
    

    专辑.rb

    belongs_to :clip
    

    clip.show可以看节目,clip.albums可以看专辑——clip.albums.find(params[:id])可以调用个别专辑

    【讨论】:

    • 它们必须属于一个用户。用户可以创建相册和节目。他们可以编辑专辑等。
    • 对不起,也许我措辞不好......通过这种安排,他们仍然属于给定的用户 - 因为clip实际上是User.clips.find(x)。所以当 belongs_to 某个剪辑时,它会自动与给定用户相关
    • 太棒了,所以问题 #1 应该已经解决了。但是我该如何设置上传。这意味着当用户上传剪辑时,他如何将其附加到特定专辑(因为会有很多)或他的节目?
    • 对于用户将剪辑添加到专辑中,专辑应该已经存在,所以也许我误解了最初的问题。 clips 实际上不属于每个albumshow
    • 问题 #1 是您解释的关联。问题 #2 是如何将剪辑分配给特定专辑或节目。剪辑属于专辑和节目,但不属于每个。无论是专辑,还是节目。用户如何选择他想要分配剪辑的位置?
    猜你喜欢
    • 1970-01-01
    • 2014-09-20
    • 2012-03-31
    • 2014-12-24
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多