2017-01-09 34 views
0

我目前正在研究一個用戶可以發佈視頻的應用程序。 視頻可以有超過1個演員和超過1個類別。 演員可以有超過1個視頻。 類別可以有多個視頻。Rails:模型協會和各自的控制器

我不太確定如何設置模型之間的關聯。

另外,我應該爲每個模型有不同的控制器?

非常感謝!

回答

0

讓我們從VideoActor開始。既然我們想要一個多對多的關係,我們需要一個連接表。讓我們調用連接表roles併爲其創建一個模型。

class Video < ApplicationRecord 
    has_many :roles 
    has_many :actors, though: :roles 
end 

class Actor < ApplicationRecord 
    has_many :roles 
    has_many :videos, though: :roles 
end 

class Role < ApplicationRecord 
    belongs_to :actor 
    belongs_to :video 
end 

我們可以應用相同的邏輯來分類:

class Video < ApplicationRecord 
    has_many :roles 
    has_many :actors, though: :roles 
    has_many :categorizations 
    has_many :categories, through: categorizations 
end 

class Category < ApplicationRecord 
    has_many :categorizations 
    has_many :video, through: categorizations 
end 

class Categorization < ApplicationRecord 
    belongs_to :video 
    belongs_to :category 
end 

另一種方式做,這是通過使用has_and_belongs_to_many它不需要加入模型,但has many limitations。爲角色使用專用模型使得例如添加角色的名稱變得微不足道,並允許您直接查詢表。

如果您希望類別能夠應用於多種模型,您也可以使用polymorphism

另外,我應該爲每個模型有不同的控制器?

一個好的經驗法則是每個resource至少有一個控制器,您的應用程序公開路由。記住單一責任原則。請注意,這並不意味着每個模型都需要一個控制器,反之亦然 - 每個控制器都不需要一個模型。

+0

你怎麼知道他使用Rails 5來確保ApplicationRecord能夠工作?也許我錯過了一些東西,但在原始問題中沒有澄清。 –

+0

我的確在使用Rails 5;我忘了提及它。 –

+0

@DarioBarrionuevo幸運的猜測。 – max

0

一般來說,每個模型應該有不同的控制器,具體取決於你在做什麼。

我不會建議使用has_and_belongs_to_many。有很多文章指出使用它時的調試困難。簡單的谷歌搜索應該可以解釋爲什麼。相反,使用連接表。

video.rb 
has_many :actors, through: :video_actors 
has_many :video_actors 
has_many :categories, through: :video_categories 
has_many :video_categories 

video_categories.rb 
belongs_to :video 
belongs_to :category 

video_actors.rb 
belongs_to :video 
belongs_to :actor 

actor.rb 
has_many :videos, through: :video_actors 
has_many :video_actors 

category.rb 
has_many :videos, through: :video_categories 
has_many :video_categories 
+0

它是一個相當不錯的答案。但是,如果您使用'class Video ... end'並縮進內容而不是每個文件的文件名,它會更具可讀性。 – max