首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何建模多博客网站?

如何建模多博客网站?
EN

Stack Overflow用户
提问于 2009-05-27 15:29:54
回答 2查看 408关注 0票数 2

我有这些桌子:

代码语言:javascript
复制
**Sites**
:has_many :blogs
:has_many :pages

**Blogs**
:belongs_to :site

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

基本上,我希望能够创建与站点相关的页面,或者创建与博客相关的页面,其路径如下:

代码语言:javascript
复制
/blogs/1/pages/1
/sites/1/pages/2 

使用当前的设置,我的Pages表有一个用于blog_id和site_id的blog_id和site_id--我正在考虑这样做:

如果要为站点创建页面(意味着它不属于博客),则将accordingly

  • but,=设置为NULL,但如果要为博客(已经属于站点)创建页面,则设置site_id

  • ,然后设置相关的site_id和blog_id

然后,如果我想要一个站点页面的列表:我只需查询pages表中的所有空blog_ids,如果我想要博客页面,我就可以通过与Blog的关系了。

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

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-05-27 20:54:48

您可以使用多态关联。

pages表中添加外键和类型列。找一个形容词来描述页面可以属于的类的公共属性。我想出了pageable (它给了我一个pageable_idpageable_type专栏)。如果使用迁移,则添加以下Page迁移:

代码语言:javascript
复制
# Adds "pageable_id" integer column and "pageable_type" string column.
t.references(:pageable, :polymorphic => true)

在您的模型中,指定使用has_many/belongs_to时的多态关系

代码语言:javascript
复制
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

然后看:

代码语言:javascript
复制
# 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

我希望这能帮到你。

票数 5
EN

Stack Overflow用户

发布于 2009-05-27 20:55:46

您应该查看多态分类:http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

基本上,你是在正确的轨道上,但你想要做的事情有一个现有的模式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/916412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档