2014-06-09 1 views
0

내 Ruby on Rails 프로젝트에서 나는 사용자 모델과 콘텐츠 모델을 가지고 있습니다.Ruby on Rails에서 재생 목록 개념을 구현하는 방법

A 사용자 has_many :contents 및 내용 belongs_to :user.

이제 재생 목록 아이디어를 만들고 싶습니다. 두 개 이상의 재생 목록이 있으며 각 콘텐츠에는 순서에 따라 일부 콘텐츠가 있습니다. 현재 사용자가 재생 목록을 소유했는지 여부는 중요하지 않으며 일반적입니다.

재생 목록은 사용자와 관련성이 없습니다. 그들은 시스템에 의해 소유 된 일반 일 것이다. playlist_id:integer content_id:integer order:integer :

나는이 솔루션은 이러한 속성을 가진 모델 재생 목록 다른 테이블에있는 같이 무언가를 할 것이라 생각합니다. 하지만 정말로이 새로운 관계에 모든 MVC 부품을 만들어야합니까? 나는 레일 협회에 보면서

, 나는 혼란있어 나는이 작업을 수행하는 방법을 모르는, 심지어 어떻게를 만드는 내용재생 목록 또는 두 가지 모두에 has_and_belongs_to_many을 사용하여 을 통해 속성을 사용하는 경우 새로운 관계.

누군가가 나를 도울 수 있다면 기쁠 것입니다. 알다시피, 저는 약간 혼란 스럽습니다.

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 

내가 거기에 시작하고, 당신이 원하는대로 행동하는 것 있는지 확인하기 위해 몇 가지 테스트를 작성하는 것 :이 같은 추측하고있어

+0

수행 : 당신은 여기 (포크, 클론, 당신이 원하는 무엇이든) 볼 수 있습니다 http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association

사용자가 재생 목록을 통해서만 콘텐츠에 액세스하나요? 그렇다면'through '가 당신이 원하는 것일 수 있습니다. 그러나 사용자가 재생 목록에없는 콘텐츠에 액세스 할 수 있어야한다면'through '가 제한 될 수 있습니다. – rdnewman

+0

사용자는 모든 내용에 액세스 할 수 있습니다. 재생 목록의 유일한 목표는 JSON으로 다른 컴퓨터의 JavaScript 파일로 전달되는 주문한 콘텐츠를 갖는 것입니다. 사용자 액세스를 제한하기 위해 생성되지는 않습니다. –

+0

우리가 다이어그램을 작성했다면 원하는 것은 무엇입니까? a) 사용자 <-> 내용; b) 사용자 <-> 재생 목록; (c) 재생 목록 <-> 콘텐츠, 맞습니까? (여기서 "<->"은 어떤 종류의 연결을 의미합니다.) – rdnewman

답변

1

당신을 위해 솔루션입니다

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 

을 통해 사용 has_many 마이그레이션 : 이제

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에 주문 정수를 지정할 수 있고, 미래에 당신이 순서를 변경할 수 있습니다 재생 목록의 값을 콘텐츠 _ 재생 목록으로 변경합니다.

새로운 content_playlist을 추가하려면 :

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

참조 : 당신이를 위해 의도 https://github.com/bdfantini/hmt_example

+0

답변 주셔서 감사합니다. 그러나 이것은 제가 정말로 필요로하는 것이 아닙니다. 내 응용 프로그램의 재생 목록은 사용자가 아니며 일반적으로 관리자 나 다른 사용자가 만든 것입니다. 지금까지는 사용자가 사용자와 연관되기를 원하지 않습니다. 대답은 내가 원하는 것만은 아니다. –

+0

당신이 원하는 것을 읽으십시오 나는 당신을 위해 또 다른 대답을 만들 것입니다 – Fantini

+0

그런데 그렇게하면 어떻게 하나 이상의 재생 목록을 가질 수 있고 임의의 순서로 내용을 유지할 수 있습니까? 내 목표는 컨텐츠 순서가 변경 될 수있는 주요 재생 목록 (결국 하나 이상)을 갖는 것입니다. 나는 단지 "has_many : contents"로 할 수 있는지 확신하지 못한다. –

0

당신이 원하는합니다. 디자인에 다른 제약 조건이있는 경우이를 조정해야 할 수 있습니다.

+0

나는 그 근처에 있다고 생각하지만 사용자가 어떤 종류의 재생 목록과도 연관되기를 원하지 않습니다. 재생 목록은 일반적으로 시스템 자체에 속합니다. 그래서, 이것은 내가 정말로 필요한 것이 아닙니다. –

관련 문제