Rails:STI结构中子类需要多态关联?

时间:2011-11-11 17:10:03

标签: ruby-on-rails polymorphism sti

我正在开发一个业余爱好项目并拥有一个带有STI子类EventMealOuting等的抽象Medication模型。Event父模型有start_timeend_timedescription

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

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

我的问题是:

  1. 嵌套资源应该是多态的吗?
  2. 如果我将它们变为多态,那么所有实例都会在类型表中包含Event吗?
  3. 如果是的话,我应该让他们has_many关系吗?
  4. 制作has_many与多态的对比是否有任何性能优势?

1 个答案:

答案 0 :(得分: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时,您应该获得所有foos的ActiveRecord关系,包括子类型。