belongs_to的型号可以是几种型号吗?

时间:2014-02-26 20:37:56

标签: ruby-on-rails associations

这就是我现在的情况:

Adword has_many pages
page belongs_to Adword

现在我想放置另一个广告提供商,这也会生成网页。所以,理想情况下我想以某种方式说出类似的话(这就是我失去的地方):

AdProvider has_many pages
page belongs_to AdProvider

AdProvider可能是Adwords,X,Y - 在Rails中处理这种情况的正确方法是什么?现在我在页面中只有一个adword_id属性,但是会有一些页面与Adword无关,而是与另一个广告提供商相关联。

4 个答案:

答案 0 :(得分:1)

使用Polymorphic association

来自doc:

  

通过多态关联,模型可以属于多个   其他模型,单一关联。例如,你可能有一个   属于员工模型或产品的图片模型   模型。

答案 1 :(得分:1)

当我想完成此操作时,我使用单表继承(STI)。

“在处理共享大部分相同功能和数据字段的模型类时应考虑STI,但您作为开发人员可能希望对单独扩展或添加每个类进行更细粒度的控制。而不是复制代码和对于多个表(而不是DRY)或放弃添加特殊功能或方法的灵活性,STI允许您在编写专用功能时使用将数据保存在单个表中。“

您可以详细了解here

答案 2 :(得分:0)

正如@emaillenin所建议的那样,你可以使用polimorphic association来解决这个问题。

您可以详细了解here

但是你应该记住,分享这种类型关联的类应该遵循一种模式,否则你最终会得到大量的if语句,以避免它们的差异。

但是,根据您对AdProvider和Adword之间关系的描述,我猜测您正在使用STI(单表继承)系统,因此已经暗示了这些相似之处。

答案 3 :(得分:0)

本文将帮助您在多态性和STI方法之间做出选择:STI

您可以在下面找到文章的引用: “ 第3。对象是否具有相似的数据但行为不同?

每个模型共享多少个数据库列?如果要存在许多特定于模型的列,则应考虑多态关联。另一方面,如果汽车,卡车和摩托车都具有相同的属性,例如:

color
engine_size
price

但不同的方法实现,例如:

drivetrain_weight # sums different components
value_after_depreciation(years) # uses different depreciation rates
drivers_license_certifications # references different certifications

然后单表继承可能是一个很好的设计选择。如果在一些方法中只有微小的差异,你可能想“欺骗”并使用单一类。“