Ruby on rails 设计多态类

Ruby on rails 设计多态类,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我们有一个rails应用程序,它使用两种模式:图像和视频。 它们都属于集合实体。 如果我们想以统一的方式查询或使用这两种类型,我们就不能。因此,如果我们想要获取最后15个,我们将查询两次,然后进行排序,然后再次获取15个。 如果我们想找到一些id,我们总是需要得到它的类型-视频或图像 所以我们在考虑如何解决这个问题。 持有的资产模型是否指向其中一个? 它能被急切地装载吗 在我的视野中,它必须是Asset.find_id,我将不可知地获得图像或视频 在Rails中解决这个问题最简单或最正确的方法是

我们有一个rails应用程序,它使用两种模式:图像和视频。 它们都属于集合实体。 如果我们想以统一的方式查询或使用这两种类型,我们就不能。因此,如果我们想要获取最后15个,我们将查询两次,然后进行排序,然后再次获取15个。 如果我们想找到一些id,我们总是需要得到它的类型-视频或图像

所以我们在考虑如何解决这个问题。 持有的资产模型是否指向其中一个? 它能被急切地装载吗

在我的视野中,它必须是Asset.find_id,我将不可知地获得图像或视频

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

谢谢

你可以用它来实现这个目标

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

现在在您的模型中:

class MediaItem < ApplicationRecord
  belongs_to :collection
end

class Collection < ApplicationRecord
  has_many :media_items
end
不过,这种方法也有一些缺点。例如,子类可能有许多不同的属性,最终可能会有太多的属性在一个子类中使用,而在另一个子类中使用不到,反之亦然


有一些解决方法,比如有一个类似散列的属性字段,它包含子类特定的属性。但是,如果您需要对特定属性进行索引,而您的DB不支持此类索引,那么这也可能会成为问题。或者你也可以做一个单独的属性
表对于每个子类具有1对1的关系,这种方式称为多表继承,但这也有其缺点。这完全取决于您的特定用例。

我认为rails中的enum是您需要的。希望这有帮助。没有正确的方法来解决这个问题,因为它是一个例子。解决此问题的常用方法是使用单表或多表继承。使用Tamer描述的STI将允许您执行MediaItem.findid,并根据结果获取视频或图像模型。您只需为每个具有1对1关系的子类创建单独的属性表即可。-这就是通常所说的多表继承。@max非常感谢,我实际上不知道它有一个名称lol。我将相应地更新答案。我希望使用我现在拥有的模型。您的建议是,我应该将我的整个模型和应用程序转换为MediaItem。
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