【发布时间】:2011-07-17 19:28:56
【问题描述】:
我有一个问题,我认为这对大多数 RoR 开发人员来说是基本的。事实上,它更多的是关于“理解”而不是真正的编程(我已经编写了一些模块来扩展 ActiveRecord::Base 以允许轻松生成与 Ext-JS 相关的东西而没有任何问题)。
我们举个简单的例子,我会用面向 ORM 的语言而不是数据库/模型语言。
- ThirdParty 是一个基本实体,有一个名为“label”的通用成员。
- ThirdParty 实例可以是客户、供应商,或者两者都不是(因此客户/供应商就像具体的接口,而不是继承的类)。
- Customer 和 Supplier 都有专门的成员,其中大多数成员对每个类都是唯一的(除了通过第三方绑定的标签字段外,客户/供应商不共享太多数据)。
我尝试过做各种各样的事情:
- 第三方<:base>
- 客户
- 供应商
[编辑] 在这里错过了我的解释。我的意思是:第三方的一个实例可能是客户、供应商、两者或无。 正如第一位评论者指出的那样,我的示例可能不是最好的......您可以将“第三方”替换为“角色”,将“客户”/“供应商”替换为“弓箭手”/“SwordsMan”。一个字符可以是一个、两个、两者或无,但会提供有关任何 Character 实例的信息。 Archer / SwordsMan 上的 getter 应返回“实现”接口契约的 Character 实例,而不是仅返回他们自己的实例,并在角色对象上使用“getter”。 [/编辑]
我也试过了:
- 第三方
- 客户 <:base thirdparty>
- 供应商
但这对我来说似乎有点“丑陋”,因为我必须执行 Customer.find(something).third_party.label 才能访问我的“接口”“继承”的数据。
另外,我可以在我的 ThirdParty 模型中包含 customer_id 和 supplier_id 字段,但这似乎也不对,因为一个 ThirdParty 可以两者兼有,或者都不是...
当然,我希望能够找到一个不会造成阻碍/没有太多技巧的解决方案,例如,让我可以为另一个模型做一些多态关联(例如可寻址,或可评论、可联系等...)
我也一直在阅读很多关于这个主题的文章,比如在这样的博客上:http://mediumexposure.com/multiple-table-inheritance-active-record/ ...但我迷失在正确的方式上(在我找到的关于这个主题的大多数文档中)不清楚它是否适用于 Rails 1、2、3……最近在这件事上实施了什么,等等)。
有人可以为我提供各种“最新”网站或适合我给出的示例的示例吗?
在此先感谢大家提出我的问题,并最终向我解释在这个特定主题上使用的不同技术。
PS:如果您需要我解释更多我在寻找什么,我可以尝试......但请记住,我的英语在这个领域有点“有限”,因为我对 RoR 比较陌生.
【问题讨论】:
-
Customer和Supplier之间真的有足够的共同点来保证类层次结构可以加入它们吗?听起来您有一个在它们之间共享的成员字段,这感觉就像很多机器可以避免一个字段的重复。 -
我的例子其实只是一个例子。假设它是一个游戏角色系统,那么......角色可以是弓箭手,剑士等。所有这些,或者没有它们,但它仍然是一个“人”角色。我只想看到一个与示例匹配的解决方案,以更好地代表我自己如何实现它。
-
皮埃尔,谢谢,我现在明白了:) 你的第二个例子也很好,但我真的无法提出比你尝试过的更好的建议。 :)
-
没问题,感谢您的阅读;)
-
在您的 sti 示例中 Customer.all 应该只返回客户,而不是所有第三方。确保添加类型列。
标签: ruby-on-rails model polymorphic-associations mixins sti