如何建模多博客网站?

时间:2009-05-27 15:29:55

标签: ruby-on-rails database-design

我有这些表:

**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 

使用我当前的设置,我的Pages表有一个blog_id和site_id的foreign_key - 我只是想这样做:

  • 如果正在为网站创建页面(意味着它不属于博客),则将blog_id =设置为NULL,但相应地设置site_id

  • 但是,如果正在为博客(已经属于某个站点)创建页面,则设置相关的site_id和blog_id

然后,如果我想要一个站点页面列表:我可以只查询Pages表中的所有NULL blog_ids,如果我想要Blog页面,我将通过与Blog的关系得到它们。

更新:我接受了下面建议使用“多态关联”的答案,但是这也可以使用单表继承来完成吗?如果是这样,哪种方法更好?

感谢。

2 个答案:

答案 0 :(得分: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

我希望这会有所帮助。

答案 1 :(得分:1)

你应该研究多态关联:{{3p>

基本上,你是在正确的轨道上,但是你现在正在尝试做什么模式。