gpt4 book ai didi

ruby-on-rails - 避免 Rails 中的多态关联

转载 作者:行者123 更新时间:2023-12-04 18:33:49 25 4
gpt4 key购买 nike

(抱歉英语不好)

假设我有模型 A、B、C。每个模型都有一个地址。

在“SQL 反模式:避免数据库编程的陷阱”一书中(第 7 章 - 多态关联)
有一种方法可以通过使用“通用 super 表”(也称为基表或祖先表)来避免此类关联。

在多态上,它将是:

table addresses:
id: integer
parent_type:string # 'A', 'B' or 'C'
parent_id: integer

我知道您可以使用交集表,但以下解决方案看起来更精致:

配方建议创建一个只有一个 id 字段(代理键或伪键)的 super 表(寻址),而不是多态地将 A、B、C 与地址相关联。然后,其他表引用寻址。这样,作者说,“您可以依靠外键强制执行数据库的数据完整性”。
所以,它会是:
table addressing
id: integer
table addresses
id: integer
addressing_id: integer (foreign_key)
zip: string
table a
id: integer
addressing_id: integer (foreign_key)
name: string
table b
id: integer
addressing_id: integer (foreign_key)
name: string
table c
id: integer
addressing_id: integer (foreign_key)
name: string

SQL 查询将如下所示:
SELECT * from a
JOIN address USING addressing_id
WHERE a.addressing_id = 1243

问题是:如何在 Rails 中编写这样的场景?我尝试了几种方法都没有成功。

最佳答案

对象 A、B 和 C 是否各有一个地址?还是很多地址?从您下面的评论看来,每个对象都有一个地址。

如果每个对象只有一个地址,您可以简单地将外键放入具有地址 ID 的 A/B/C 对象中。让 House 或 Office 对象有一个地址:

class House < ActiveRecord::Base
belongs_to :address
end

class Office < ActiveRecord::Base
belongs_to :address
end

您的 office s 和 houses数据库表 need to have a foreign key address_id .
这样,您可以使用 house.address 之类的方式访问对象的地址。或 office.address .

如果这些对象可能有许多地址,则解决方案取决于 A/B/C 对象。如果它们是相关的,您可以使用单表继承 - Rails supports this pattern well - 但如果没有更多信息,很难说哪个是最好的方法。

关于ruby-on-rails - 避免 Rails 中的多态关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9642311/

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