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 会很整洁,您的数据会自然地组织起来,您不会受到太大伤害。
我看到多态关联打破了关系数据库设计的规则,最终对应用程序造成了更大的危害。所以,左边的选择是使用 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 会很整洁,您的数据会自然地组织起来,您不会受到太大伤害。