2

我正在做一个爱好项目,并且有一个Event带有 STI 子类Meal, Outing,Medication等的抽象模型。Event父模型有start_time, end_time,description等。

我想为各种子类提供嵌套资源。例如,我希望能够将类的多个实例附加Image到任何子Event类。我希望能够将Medicine类的多个实例附加到Medication实体、 to 的多个实例LocationOuting

我考虑多态性的原因是为了提供灵活性,以便可以想象,任何不同类型的嵌套资源都可以附加到的任何子类上,Event.这将允许某人将“维生素 D 补充剂”的药物附加到 aMeal上,例如.

我的问题是:

  1. 嵌套资源应该是多态的吗?
  2. 如果我使它们成为多态的,所有实例都会包含Event在类型表中吗?
  3. 如果是这样,我应该让他们has_many建立关系吗?
  4. 使它们has_many与多态相比有什么性能优势吗?
4

1 回答 1

0

(1) 是的。

(2) 是的,取决于您如何处理多态性。Rails 允许 STI(单表继承),因此事件的所有子类型都可以继承 has_many 关系。相关的 has_many 记录可以有很多子类型,所有这些子类型在调用时都会以关系的形式出现。

(3) has_many 可以和多态一起使用,它们不是互斥的。

(4) 同样,两者并不相互排斥。实际上,您的 belongs_to 关系需要多态。您的相关记录应在其表中包含一个relation_id 和relation_type。例如,如果您使用 STI,您可以这样做:

class BaseClass < ActiveRecord::Base
  has_many :foo
end

class SubClass < BaseClass
  # inherits has_many :foo relation from BaseClass
end

class Foo < ActiveRecord::Base
  belongs_to :base_class, polymorphic: true
end

class Bar < Foo
  # inherits belongs_to :base_class from Foo
end

调用 sub_class-instance.foos 时,您应该获得所有 foo 的 ActiveRecord 关系,包括子类型。

于 2014-11-23T21:07:07.920 回答