基本的例子

首先,我們需要一個表來儲存我們的資料

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.string :password
      t.string :type # <- This makes it an STI

      t.timestamps
    end
  end
end

然後讓我們建立一些模型

class User < ActiveRecord::Base
   validates_presence_of :password
   # This is a parent class. All shared logic goes here
end

class Admin < User
   # Admins must have more secure passwords than regular users
   # We can add it here
   validates :custom_password_validation
end

class Guest < User
   # Lets say that we have a guest type login. 
   # It has a static password that cannot be changed
   validates_inclusion_of :password, in: ['guest_password']
end

當你執行 Guest.create(name: 'Bob') 時,ActiveRecord 將對此進行翻譯,以使用 type: 'Guest'在 Users 表中建立一個條目。

當你檢索記錄 bob = User.where(name: 'Bob').first 時,返回的物件將是 Guest 的一個例項,可以用 bob.becomes(User) 強制將其視為使用者

在處理超類的共享部分或路由/控制器而不是子類時,變得最有用。