2009-05-27 192 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 

我希望这有帮助。