如何在Ruby on Rails中实现播放列表概念

时间:2014-06-09 16:55:07

标签: ruby-on-rails associations playlist

在我的Ruby on Rails项目中,我有一个用户模型和一个内容模型。

用户has_many :contents和内容belongs_to :user

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

播放列表与用户没有任何关联。它们将是一般的,由系统拥有。

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

当我查看Rails协会时,我感到困惑,如果使用属性,在中使用has_and_belongs_to_many,我就不知道如何执行此操作内容播放列表,甚至是如何创建这种新关系。

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

2 个答案:

答案 0 :(得分:1)

您的解决方案是使用has_many到

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

你可以在这里看到(分叉,克隆,做你想做的任何事情): https://github.com/bdfantini/hmt_example

答案 1 :(得分:0)

我猜这是你想要的东西:

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

我会从那里开始,并编写一些测试,以确定它是否符合您的要求。如果您的设计有其他限制,我们可能需要对其进行一些调整。