设计一个多态类

时间:2017-10-14 10:56:00

标签: ruby-on-rails activerecord

我们有一个使用2种型号的rails应用程序:图像和视频。 它们都属于一个集合实体。 如果我们想以统一的方式查询或使用这两种类型,我们会发生什么。因此,如果我们想要获取最后15个,我们查询两次然后排序然后再次取15。 如果我们想找到()一些id,我们需要总是得到它的类型 - 视频或图像......

所以我们在考虑如何解决这个问题。 持有一个指向任何一个的资产模型? 是否能够热切地加载?

在我的视野中,它必须是Asset.find(_id),我将获得图片或视频。

在Rails中解决这个问题的最简单或最正确的方法是什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用Single Table Inheritance来实现此目标。

我们假设您有一个名为Media的模型:

rails g model media_item type:string <other attributes here>

然后你继承了两个模型:VideoImage,如下所示:

rails g model video --parent=MediaItem
rails g model image --parent=MediaItem

现在进入你的模特:

class MediaItem < ApplicationRecord
  belongs_to :collection
end

class Collection < ApplicationRecord
  has_many :media_items
end

这种方法虽然有一些缺点。例如,子类可能有许多不同的属性,并且最终可能会有太多属性在一个子类中使用而在另一个子类中使用,反之亦然。

有一些解决方法,比如有一个类似哈希的properties字段,并且包含特定于子类的属性。但是,如果您需要索引特定属性并且您的数据库不支持此类索引,这也可能会成为问题。或者你可以制作一个单独的属性 每个子类的表与1对1的关系,一种称为多表继承的方式,但这也有它的缺点。这完全取决于您的具体用例。