Rails 替代使用多态关联

Rails Alternative to use polymorphic associations

我看到多态关联打破了关系数据库设计的规则,最终对应用程序造成了更大的危害。所以,左边的选择是使用 STI。有人可以解释一下 STI 是如何工作的,或者知道在使用多态关联方面是否还有其他好的选择?

谢谢

关于 STI

当您使用 STI 时,您有一个父模型,它在数据库中有自己的 table。然后你有几个子模型。但是他们没有自己的tables。相反,它们的对象存储在父模型的 table 中。

我们来看例子

生成父模型Vehicle。向其中添加 type 列。该列将用于存储相应对象所属的子模型的名称。

$ rails generate model vehicle type:string color:string price:decimal{10.2}

然后生成子模型告诉 Vehicle 是它们的父模型:

$ rails generate model car --parent=Vehicle
$ rails generate model truck --parent=Vehicle

您将获得以下模型:

class Car < Vehicle
end

class Truck < Vehicle
end

现在,当您创建新车时,它将存储在 vehicles table 中,并且 'car'type 列中。卡车也将存放在 vehicles table 中。但是他们会在 type 列中有 'truck'

关于好的和坏的选择。

您知道,STI 不是灵丹妙药,也被认为是非常糟糕的做法。例如,它可以使您的父模型的 table 成为混乱的噩梦。它可以阻止您有效地索引数据等等。

事实上,您可以在适合您的需要时使用特定的练习。当您拥有大部分相同的子模型但行为可能略有不同时,STI 非常有用。在那种情况下,您的 table 会很整洁,您的数据会自然地组织起来,您不会受到太大伤害。