在我的Ruby on Rails项目中,我有一个用户模型和一个内容模型。
用户has_many :contents
和内容belongs_to :user
。
现在,我想创建播放列表的想法。将有多个播放列表,每个播放列表将按某种顺序包含一些内容。此时,如果用户拥有播放列表并不重要,那么它们就是一般的。
播放列表与用户没有任何关联。它们将是一般的,由系统拥有。
我认为解决方案类似于拥有模型播放列表,以及另一个包含这些属性的表:playlist_id:integer content_id:integer order:integer
。但我真的需要为这种新关系创建所有MVC部分吗?
当我查看Rails协会时,我感到困惑,如果使用到属性,在中使用has_and_belongs_to_many
,我就不知道如何执行此操作内容和播放列表,甚至是如何创建这种新关系。
如果有人可以帮助我,我很高兴,你可以看到,我有点困惑。
答案 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
我会从那里开始,并编写一些测试,以确定它是否符合您的要求。如果您的设计有其他限制,我们可能需要对其进行一些调整。