ENUM(열거형) 생성
새로운 열거형을 만들 때는 데이터베이스 유형 SMALLINT
를 사용해야 합니다.
SMALLINT
유형은 2바이트로, 열거형에 충분합니다.
이렇게 하면 데이터베이스 공간을 절약할 수 있습니다.
이 유형을 사용하려면 열을 생성하는 마이그레이션에 limit: 2
를 추가하십시오.
예시:
def change
add_column :ci_job_artifacts, :file_format, :integer, limit: 2
end
모든 키/값 쌍은 FOSS에 정의되어야 합니다
요약: 모든 열거형은 FOSS에서 정의되어야 하며, 모델이 FOSS의 일부인 경우에도 마찬가지입니다.
class Model < ApplicationRecord
enum platform: {
aws: 0,
gcp: 1 # EE-only
}
end
enum
에 새로운 키/값 쌍을 추가하고, 그것이 EE에 특화된 경우, 다음과 같이 enum
을 구성하기도 합니다.
# `Pipeline` 모델에 `failure_reason` 열거형 정의:
class Pipeline < ApplicationRecord
enum failure_reason: Enums::Pipeline.failure_reasons
end
# FOSS 및 EE에서 사용되는 키/값 쌍 정의:
module Enums
module Pipeline
def self.failure_reasons
{ unknown_failure: 0, config_error: 1 }
end
end
end
Enums::Pipeline.prepend_mod_with('Enums::Pipeline')
# EE 전용으로 사용되는 키/값 쌍 정의:
module EE
module Enums
module Pipeline
override :failure_reasons
def failure_reasons
super.merge(job_activity_limit_exceeded: 2)
end
end
end
end
이는 현재 그대로 작동하지만, 다음과 같은 단점이 있습니다.
- EE에서 FOSS에서 정의된 값과 충돌하는 값으로 키/값 쌍을 정의할 수 있습니다.
예를 들어,
EE::Enums::Pipeline
에서job_activity_limit_exceeded: 1
을 정의합니다. - 이렇게 되면, 기능이 완전히 다르게 동작합니다.
예를 들어,
failure_reason
이config_error
인지job_activity_limit_exceeded
인지 알 수 없게 됩니다. - 이렇게 되면, 데이터 무결성을 수정하기 위해 데이터베이스 마이그레이션을 배포해야 합니다. 원래 값으로 복구할 수 없는 경우 불가능할 수도 있습니다.
또한, EE
모듈의 값에 오프셋을 설정하여이 문제를 해결할 수 있는 임시방편을 사용할 수 있습니다.
예를 들어, 이 예시에서는 오프셋으로 1000
을 설정합니다.
module EE
module Enums
module Pipeline
override :failure_reasons
def failure_reasons
super.merge(job_activity_limit_exceeded: 1_000, size_limit_exceeded: 1_001)
end
end
end
end
이는 임시방편으로 작동하는 것으로 보이지만, 이 방법에는 다음과 같은 단점이 있습니다.
- 기능이 EE에서 FOSS로 또는 그 반대로 이동할 수 있습니다. 따라서 오프셋은 향후 FOSS 및 EE 사이에 혼합될 수 있습니다.
예를 들어,
job_activity_limit_exceeded
를 FOSS로 이동하는 경우{ unknown_failure: 0, config_error: 1, job_activity_limit_exceeded: 1_000 }
와 같이 표시됩니다. -
enum
에 대한 정수 열이 일반적으로SMALLINT
로 생성됩니다. 따라서 오프셋이 2바이트 정수의 최대 값을 초과하지 않도록 주의해야 합니다.
결론적으로 모든 키/값 쌍을 FOSS에 정의해야 합니다. 예를 들어, 위의 경우 다음과 같이 작성할 수 있습니다.
class Pipeline < ApplicationRecord
enum failure_reason: {
unknown_failure: 0,
config_error: 1,
job_activity_limit_exceeded: 2
}
end
갭에 새 값 추가하기
일부 EE 및 FOSS 열거형을 Merge한 후에는 두 그룹의 값 사이에 갭이 생길 수 있습니다.
module Enums
module Ci
module CommitStatus
def self.failure_reasons
{
# ...
data_integrity_failure: 12,
forward_deployment_failure: 13,
insufficient_bridge_permissions: 1_001,
downstream_bridge_project_not_found: 1_002,
# ...
}
end
end
end
end
새 값을 추가하려면 먼저 갭을 채워야 합니다.
예를 들어 위의 예시에서 1_003
대신에 14
를 추가하십시오.
{
# ...
data_integrity_failure: 12,
forward_deployment_failure: 13,
a_new_value: 14,
insufficient_bridge_permissions: 1_001,
downstream_bridge_project_not_found: 1_002,
# ...
}