Ruby on rails 如何为多博客网站建模?

Ruby on rails 如何为多博客网站建模?,ruby-on-rails,database-design,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的外键,我正考虑这样做: 如果正在为站点

我有这些桌子:

**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的外键,我正考虑这样做:

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

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

然后,如果我想要一个站点页面列表:我可以在pages表中查询所有空blog_id,如果我想要blog页面,我将通过与blog的关系获取它们

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


谢谢。

您可以使用多态关联

将外键和类型列添加到
页面
表中。找一个形容词来描述页面所属类的公共属性。我想出了
pageable
(这给了我一个
pageable\u id
pageable\u type
列)。如果使用迁移,请在
页面
迁移中添加以下内容:

# Adds "pageable_id" integer column and "pageable_type" string column.
t.references(:pageable, :polymorphic => true)
在您的模型中,指定使用
has\u many
/
所属的多态关系:

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