Ruby on Rails 마이그레이션에서 PostgreSQL 함수를 활용하는 구체적인 예시는 컬럼에 무작위 문자열을 기본값으로 설정하고, 여기에 특정 prefix와 suffix를 추가하는 경우를 다룹니다.
ruby
add_column :table, :column, :text, default: -> { "('prefix-' || md5(random()::text) || 'suffix')" }, null: false, if_not_exists: true
이 코드 스니펫의 주요 구성 요소는 다음과 같습니다:
-
add_column:table테이블에column이라는text타입의 컬럼을 추가하는 표준 Rails 마이그레이션 구문입니다. -
default: -> { ... }: 이 부분이 핵심으로,:default옵션에 Ruby의 람다 블록을 전달하여, 데이터베이스가 직접 실행할 SQL 함수를 지정합니다. 람다 내의 문자열은 데이터베이스의 기본값으로 설정될 SQL 표현식입니다. - SQL 표현식:
'prefix-' || md5(random()::text) || 'suffix'random(): PostgreSQL 함수로, 임의의 부동 소수점 숫자를 반환합니다.random()::text: 결과를 텍스트 타입으로 형변환합니다.md5(...): 입력 문자열에 대한 MD5 해시 값을 계산하여 고유한 32자리 문자열을 생성합니다.'prefix-' || ... || 'suffix': PostgreSQL의 문자열 연결 연산자(||)를 사용하여 MD5 해시 값 앞뒤에prefix-와suffix를 추가합니다.
null: false: 해당 컬럼이 NULL 값을 허용하지 않음을 명시합니다.
이 방식은 애플리케이션 로직에서 무작위 값을 생성하는 대신, 데이터베이스 레벨에서 직접 처리함으로써 효율성을 높이고 데이터 무결성을 강화하는 이점이 있습니다.