2017-02-23 47 views
1

我正在嘗試學習Rails,並且有一個讓我困惑的問題。我有兩個簡單的模型:Media & MediaType。在這種情況下,正確的Rails模型關聯會是什麼?

媒體具有像:標題,生產日期,成本等,它也有一個「類型」字段。這將是MediaType表的外鍵。 MediaType很簡單:id,name,active(t/f)。

當我想到這個時,Media has_one MediaType似乎很適合。但我也可以看到媒體belongs_to媒體類型和媒體類型has_many媒體也適合。從我的POV中,我真正需要的是Media表格存儲查看MediaTypes表格的ID。 MediaTypes表不應該存儲關於媒體的任何內容,因此將我指向「has_one」。

哪一個是正確的,每個人用什麼過程來思考這些問題?

編輯:對於這個例子,我打算媒體只有1種類型。

+0

這取決於你的意思是媒體和媒體類型。你應該問自己這樣一個問題:一種媒體類型可以有多種媒體?或者它可以只有一種媒體?上面提到的 – the12

+0

,讓我們保持簡單。媒體只能有1種類型。 – mfisch

回答

1

我個人的建議是報廢媒體類型模型,並將其作爲媒體模型的字段/列。它只有兩個相關字段(名稱和類型),因爲您不需要id,因爲只有在假設它是自己的單獨表格時才真正需要識別媒體類型。你只需要消除不必要的複雜性(可以只有一個數據庫表與兩個數據庫表)。當兩個表的列太大而無法存儲在一個表中時,一對一關係纔有意義。

如果你絕對要包括它,那麼下面應該工作:

class Media < ActiveRecord::Base 
    belongs_to :media_type 
end 

class MediaType < ActiveRecord::Base 
    has_one :media 
end 

注意與belongs_to模型將是一個存儲其他模型的外鍵。在這種情況下,因爲您希望Media存儲MediaTypes,所以您需要指定Media與MediaType具有belongs_to關係。爲模型MediaType編寫has_one:media將完成一對一的關係。

在您的遷移表中,您必須在媒體模型中將media_type_id作爲列包含在您的遷移中,以便可以存儲一對一關係。然後,您可以將哪些媒體類型存儲到哪些媒體記錄中。

+0

這是對選項的一個很好的解釋,以及爲什麼選擇這個選項,並且應該幫助我在下一次需要查看關係時進行處理,謝謝。快速的最後一個問題,我是否需要在我的遷移中手動添加外鍵,或者該關聯是否可以爲我執行此操作? – mfisch

+0

Rails會將association_id的單數形式視爲外鍵。在這種情況下,一旦將'media_type_id'作爲媒體表中的列,它將自動從'media_type'中獲取該id,並將其用作媒體表中的外鍵。雖然Rails將'media_type_id'作爲外鍵,它實際上並沒有將外鍵添加到sql表中。你將不得不使用'add_foreign_key'(遷移方法)或自己動手。有關更多詳細信息,請參閱http://guides.rubyonrails.org/active_record_migrations.html#foreign-keys。 – the12

+0

注意,具有在Rails應用程序在數據庫外鍵是不是絕對必要的,但如果你希望你的模型的查詢和SQL表之間的誠信,你可以,如果你想,添加它們。 – the12

0

type不是列的好名字,請將其重命名爲media_type_id,正如其他答案指出的那樣。

# media.rb 
class Media < ActiveRecord::Base 
    belongs_to :media_type 
end 

# media_type.rb 
class MediaType < ActiveRecord::Base 
    has_many :media 
end 
相關問題