iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 2
0
Modern Web

Ruby礦工的Rails地圖系列 第 2

STI , MTI 與多型關聯(Polymorphic Associations) 系列一

第二天挑戰一個難一點的題目
這三者使用上有點相似,所以或許有一些人會混淆
甚至也有不少人只聽過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)

接下來的分兩天講完,待續~


上一篇
i18n 搭配model與form的做法
下一篇
STI , MTI 與多型關聯(Polymorphic Associations) 系列二
系列文
Ruby礦工的Rails地圖30

尚未有邦友留言

立即登入留言