單表繼承映射


如果採取的是物件模型的方式來設計程式,那麼繼承關係可能就會在程式設計中出現,然而關聯式資料庫的關聯模型與物件模型並不匹配,例如若模型有以下的繼承關係:

# user.rb
class User < ActiveRecord::Base
end

# nobody.rb
class Nobody < User
end

# sombody.rb
class Somebody < User
end

為了映射物件模型與關聯模型,來看看繼承關係映射至關聯式資料庫的方式之一:Single-Table Inheritance。這種方式使用一個表格儲存同一個繼承階層的所有類別,並使用額外的欄位來表示所記錄的是哪一個子類別的資料,具體來說,對於繼承User類別的Nobody及Somebody,可以設計以下的表格來儲存資料:

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.integer :age
      t.string :nobody_prop
      t.string :somebody_prop
      t.string :type  # 必須有個type欄位

      t.timestamps
    end
  end
end