第二天挑戰一個難一點的題目
這三者使用上有點相似,所以或許有一些人會混淆
甚至也有不少人只聽過STI沒聽過MTI
今天就來為大家解說一下差異與使用情境
STI (single table inheritance)
中文或許可以翻譯為單一表格繼承
實作上相當簡單,只要母表格Animal多一個欄位叫做type
def change
create_table :animals do |t|
t.string :name
t.string :type
t.timestamps null: false
end
end
那麼被繼承的Dog, Cat就會使用Animal,而不需要建立自己的表格
model設定如下:
class Animal < ActiveRecord::Base
end
class Dog < Animal
end
class Cat < Animal
end
之後不管是Cat.create(name: "Mew")
或是Dog.create(name: "Woo")
實際上都是寫入Animal,如果我們查看Animal
Animal.all
=> #<ActiveRecord::Relation [#<Dog id: 1, name: "White", type: "Dog">, #<Cat id: 2, name: "Mew", type: "Cat">]>
這就是STI,但這樣方便的方法卻有個問題,假如Dog與Cat有許多不同的欄位
會有點浪費效能與空間,沒有用到的部分都會留下null
所以如果不同的欄位比相同的欄位多很多,一般不會建議使用STI
可以考慮MTI或是多型關聯(Polymorphic Associations)
接下來的分兩天講完,待續~