수색…


소개

단일 테이블 상속 (STI)은 동일한 기본 모델에서 상속 된 여러 모델의 데이터를 데이터베이스의 단일 테이블로 저장한다는 아이디어를 기반으로하는 디자인 패턴입니다.

기본 예제

먼저 데이터를 보관할 테이블이 필요합니다.

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) User로 강제 처리 될 수 있습니다.

서브 클래스 대신 슈퍼 클래스의 공유 부분 또는 라우트 / 제어기를 다룰 때 가장 유용합니다.

사용자 지정 상속 열

기본적으로 STI 모델 클래스 이름은 type 이라는 열에 저장됩니다. 그러나 기본 클래스의 inheritance_column 값을 재정 의하여 해당 이름을 변경할 수 있습니다. 예 :

class User < ActiveRecord::Base
  self.inheritance_column = :entity_type # can be string as well
end

class Admin < User; end

이 경우의 마이그레이션은 다음과 같습니다.

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.string :password
      t.string :entity_type

      t.timestamps
    end
  end
end

Admin.create 를 수행하면이 레코드가 entity_type = "Admin" 사용하여 users 테이블에 저장됩니다.

유형 열과 STI가없는 레일 모델

STI를 호출하지 않고 Rails 모델에 컬럼을 type 하면 :_type_disabledinheritance_column 으로 지정 :_type_disabled 됩니다.

class User < ActiveRecord::Base
  self.inheritance_column = :_type_disabled
end


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow