Ruby on Rails
단일 테이블 상속
수색…
소개
단일 테이블 상속 (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_disabled
를 inheritance_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