【问题标题】:How to implement playlist concept in Ruby on Rails如何在 Ruby on Rails 中实现播放列表概念
【发布时间】:2014-06-09 16:55:06
【问题描述】:

在我的 Ruby on Rails 项目中,我有一个 User 模型和一个 Content 模型。

一个用户has_many :contents 和一个内容belongs_to :user

现在,我想创建播放列表的想法。将有多个播放列表,每个播放列表都会按某种顺序包含一些内容。此时,用户是否拥有播放列表并不重要,它们将是通用的。

播放列表与用户没有任何关联。它们将是通用的,归系统所有。

我认为解决方案类似于拥有一个模型播放列表和另一个具有这些属性的表:playlist_id:integer content_id:integer order:integer。但是我真的需要为这种新关系创建所有 MVC 部分吗?

当我查看 Rails 关联时,我很困惑,我不知道该怎么做,如果使用 through 属性,在两个 内容播放列表 甚至如何建立这种新关系。

如果有人可以帮助我,我会很高兴,正如你所看到的,我有点困惑。

【问题讨论】:

  • 您是否打算让用户仅通过播放列表访问他们的内容?如果是这样,through 可能是您想要的,但如果用户应该能够访问不在播放列表中的内容,through 可能会受到限制。
  • 用户可以访问所有内容。播放列表的唯一目标是让一些有序的内容作为 JSON 传递到另一台机器上的 JavaScript 文件。它们不是为了限制用户访问而创建的。
  • 所以如果我们绘制这个图表,你想要的是 a) 用户 内容; b) 用户 播放列表; (c) 播放列表 内容,对吗? (其中,“”表示某种关联)
  • 还有一件事,如果用户要访问一个播放列表,该播放列表是否会包含用户尚未拥有的内容?
  • 用户与播放列表没有任何关联。这个播放列表概念只是关于内容和播放列表。一个播放列表可以有很多内容,一个内容可能属于多个播放列表。内容可能不属于任何播放列表而存在。

标签: ruby-on-rails associations playlist


【解决方案1】:

你的解决方案是使用 has_many through

class User < ActiveRecord::Base
  ... user code in here with no association
end

class Playlist < ActiveRecord::Base
  has_many :content_playlists
  has_many :contents, through: :content_playlists
end

class Content < ActiveRecord::Base
  has_many :content_playlists
  has_many :playlists, through: :content_playlists
end

class ContentPlaylist < ActiveRecord::Base
  belongs_to :content
  belongs_to :playlist
end

迁移:

class CreateAll < ActiveRecord::Migration
  def change
    create_table :contents do |t|
      t.string :name
      t.timestamps
    end

    create_table :playlists do |t|
      t.string :name
      t.timestamps
    end

    create_table :content_playlists do |t|
      t.belongs_to :content
      t.belongs_to :playlist
      t.integer :order
      t.timestamps
    end

   add_index(:content_playlists, :content_id)
   add_index(:content_playlists, :playlist_id)       

  end
end

现在,您可以在 content_playlists 上分配一个顺序整数,并且将来您可以重新排列播放列表以更改 contents_playlists 上的值。

添加新的 content_playlist:

c = Content.create(name: "Song 2")
p = Playlist.create(name: "My Playlists2)
ContentPlaylist.create(content: c, playlist: p, order: 1)

参考: http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association

你可以在这里看到(fork,clone,做任何你想做的事): https://github.com/bdfantini/hmt_example

【讨论】:

  • 感谢您的回答,但这不是我真正需要的。我的应用程序中的播放列表不属于用户,它们是通用的,最终由管理员或其他东西制作......所以,到目前为止,我不希望它们与用户有任何关联,因此,这个答案不是我所需要的。
  • 阅读你想要的我会为你创造另一个答案
  • 但是那样做,我怎么可能拥有多个播放列表,并以任意顺序保留内容?我的目标是拥有一个可以更改内容顺序的主播放列表(最终不止一个)。我不确定我是否可以仅使用“has_many :contents”来做到这一点。
  • 您绝对确实想要连接列上的索引。您从哪里听说它们不是必需的,因为您没有直接引用该表?
  • @gd.silva 运气好吗?当然,试试t.integer :content_idt.integer :playlist_id,但可能t.belongs_to :contents/playlists 不应该是复数形式。应该是t.belongs_to :content/playlist
【解决方案2】:

我猜你想要的是这样的:

class User < ActiveRecord::Base
  ...
  has_many :contents
  has_many :playlists
  has_many :playlisted_contents, :through => :playlists
  ...
end

class Playlist < ActiveRecord::Base
  ...
  has_many :contents
  ...
end

class Content < ActiveRecord::Base
  ...
  belongs_to  :user
  belongs_to  :playlist
  ...
end

我会从那里开始,并编写一些测试以查看它是否按照您的意愿运行。如果您的设计有其他限制,我们可能需要对此进行一些调整。

【讨论】:

  • 我认为它很接近,但我不希望用户与播放列表有任何关联。播放列表是通用的,它们属于系统本身。所以,这并不是我真正需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 2022-11-02
相关资源
最近更新 更多