基本的例子
首先,我們需要一個表來儲存我們的資料
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)
強制將其視為使用者
在處理超類的共享部分或路由/控制器而不是子類時,變得最有用。