2009-05-27 193 views
2

我有這些表:如何建模多博客網站?

**Sites** 
:has_many :blogs 
:has_many :pages 

**Blogs** 
:belongs_to :site 

**Pages** 
:belongs_to :site 
:belongs_to :blog 

基本上,我希望能夠創建要麼相關的網站或相關的博客與路線像這樣的網頁:

/blogs/1/pages/1 
/sites/1/pages/2 

隨着我的當前設置,我的頁面表中有blog_id和SITE_ID一個foreign_key - 我只是想這樣做的:如果正在FO創建頁面

  • ra網站(意思是它不屬於博客),然後將blog_id =設置爲NULL,但是相應地設置site_id

  • 但是,如果正在爲博客創建頁面(已經屬於某個站點)相關SITE_ID和blog_id

然後,如果我想網站頁面的列表:我可以只查詢頁面表的所有NULL blog_ids,如果我想博客網頁,我會通過與關係讓他們博客已經。

更新:我接受了下面的建議使用「多態關聯」的答案,但這也可以使用單表繼承?如果是這樣,哪種方法更好?

謝謝。

回答

5

您可以使用多態關聯。

將一個外鍵和一個類型列添加到您的pages表中。找到一個描述頁面可以屬於的類的共同屬性的形容詞。我想出了pageable(這給我一個pageable_idpageable_type列)。如果您使用的遷移,添加以下你的Page遷移:

# Adds "pageable_id" integer column and "pageable_type" string column. 
t.references(:pageable, :polymorphic => true) 

在你的模型中,指定多態性關係使用has_many/belongs_to時:

class Site < ActiveRecord::Base 
    has_many :pages, :as => :pageable 
end 

class Blog < ActiveRecord::Base 
    has_many :pages, :as => :pageable 
end 

class Page < ActiveRecord::Base 
    belongs_to :pageable, :polymorphic => true 
end 

看哪:

# Return all pages belonging to Site with ID 12, that is, return all pages 
# with pageable_id 12 and pageable_type "site". 
Site.find(12).pages 

# Return all pages belonging to Blog with ID 3, that is, return all pages 
# with pageable_id 3 and pageable_type "blog". 
Blog.find(3).pages 

# Returns the owner (Blog or Site) of Page with ID 27. 
Page.find(27).pageable 

我希望這有幫助。