首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多态STI设置

多态STI设置
EN

Stack Overflow用户
提问于 2011-03-05 05:07:08
回答 1查看 372关注 0票数 1

我有一个应用程序,正在广泛使用一个实体模型。

在这个应用程序的过去版本中(正在重写,当前版本在PHP中),这是用一个表继承建模的,基本上有两个相同的模型。

  • One模型是实体,它与项目关联,具有多种类型(客户端、请求者、提供程序等),
  • 另一个模型是Addressbook,它与实体基本相同,除了一个不同的表和模型名称以及一些仅限于通讯簿的字段(例如禁用)。

我们目前有一篇关于实体的专栏,用于addressbook_id将项目实体映射回地址簿,或者失败了,我们试图基于电子邮件地址进行映射。通讯簿和实体之间的数据不能保持同步,也就是说,必须能够更新项目中的实体,而不会对通讯簿中的数据产生任何影响(尽管我们也提供了更新通讯簿的选项)。

无论如何,有4或5种类型的实体。他们大多有相同的字段(姓名、姓氏、电子邮件、地址、电话等)。每个实体类型可能有1-3个字段,这些字段对它来说是唯一的,但这就是它的意义所在。除此之外,当前应用程序中的实体可能是人员或公司(相同的STI表,其中也有一个company_name字段)。

对于应用程序需要做的事情,能够很容易地找到一个项目的所有实体(不管类型,他们是人还是公司)是一个胜利。还能够轻松地将实体连接到查询中,并在每个项目中搜索它们,胜诉。

正因为如此,我倾向于坚持STI模型,并保持它的简单,因为每种类型共享90%的相同领域,这不是很多浪费。然而,我很好奇是否有什么好的建议来处理对于Addressbook和Entity都有本质上相同的模型,但是将数据保存在单独的表中的整个问题。我已经考虑过多态关联可能会有什么帮助,但我认为这会使表结构更加复杂,并可能损害查询的性能(相当大的数据集,其中这些实体可能包含在列表视图中)。

但我真的不想这样结束..。

代码语言:javascript
复制
class Entity

class Customer < Entity

class Addressbook

class AddressbookCustomer < Addressbook

etc...

不太干燥,实体类型和子类型之间也有共同的功能(例如,实体和地址簿都有一个返回全名的name方法,而且Customer和AddressbookCustomer都可能有一个last_order方法)。

当前的数据只存储在两个表中,即地址簿和实体,其中有一个类型列。然而,这是一个干净的突破,所以遗留的表结构不需要保留,但是从保持它简单的角度来看,我非常喜欢这个结构。

有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2011-03-05 06:18:23

我从来没有这样做过,但是如果您想在所有“实体”之间共享代码,为什么不创建一个其他所有继承的基类:

代码语言:javascript
复制
class OneClassToRuleThemAll < ActiveRecord::Base
  def name
  ...


class Entity < OneClassToRuleThemAll
  set_table_name "entities"

class AddressBook < OneClassToRuleThemAll
  set_table_name "address_books"

这为共享方法提供了一个基类,但为继承树中的每个分支提供了单独的表。

如果您不喜欢该解决方案,因为您仍然希望共享不属于OneClassToRuleThemAll但在树下的表亲类之间共享的方法,那么为什么不编写一个小模块来保存这些函数,比如last order,然后将该模块导入到每个需要这些函数的表亲类中?

我甚至不知道第一个例子是否有效,但我认为应该这样做。

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

https://stackoverflow.com/questions/5201821

复制
相关文章

相似问题

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