基本的例子

首先,我们需要一个表来保存我们的数据

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) 强制将其视为用户

在处理超类的共享部分或路由/控制器而不是子类时,变得最有用。