gpt4 book ai didi

ruby-on-rails - 如何建模多博客网站?

转载 作者:行者123 更新时间:2023-12-04 05:42:56 25 4
gpt4 key购买 nike

我有这些表:

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

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

然后,如果我想要网站页面列表:我可以只在页面表中查询所有 NULL blog_ids,如果我想要博客页面,我将通过与博客的关系获取它们。

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

谢谢。

最佳答案

您可以使用多态关联。

将外键和类型列添加到您的 pages 表中。找到一个形容词来描述您的页面所属类的公共(public)属性。我想出了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

我希望这会有所帮助。

关于ruby-on-rails - 如何建模多博客网站?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/916412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com