Rails 유효성 검사 - uniquness

사승준·2022년 4월 5일
0
post-thumbnail

레일즈에서는 유효성 검사 중 uniquness를 사용하여 값이 유니크한지 검사할 수 있다. uniquness 유효성 검사에는 여러 가지 옵션들이 있는데 각 옵션에 대해서 정리하려고 한다.

기본 사용 방법

class User < ApplicationRecord
  validates :email, uniqueness: true
end

여러 컬럼에 대해서 확인하기

1명의 유저는 1개의 해적단에만 가입할 수 있다고 가정하고 같은 유저가 같은 해적단에 가입하려고 할 때 유효성 검사를 하고 싶으면 scope를 사용하면 된다. 즉, 한 개의 컬럼에 대해서만 아니라 여러 컬럼에 대해서 중복되지 않게 하려고 사용한다.

class Pirate < ApplicationRecord
  belongs_to :user
  validates :id, uniqueness: { scope: :user_id }
end

scope는 배열 형태로 여러 개 지정할 수 있다.

class Pirate < ApplicationRecord
  validates :id, uniqueness: { scope: %i(user_id role) }
end

커스텀 메시지

유니크 제약 조건의 커스텀 메시지를 지정할 수 있다.

class Pirate < ApplicationRecord
  validates :role, uniqueness: { message: '이미 있는 역할입니다' ) }
end

조건

특정 조건에 부합하는 경우에만 유효성 검사를 할 수 있다. 예를 들어 이름이 에이스인 경우에만 유효성 검사를 하려면 conditions 옵션을 사용하여 할 수 있다.

class User < ApplicationRecord
  validates :email, uniqueness: { conditions: -> { where(name: 'ace') }
end

ifunless를 통해서도 할 수 있다.

class User < ApplicationRecord
  validates :email, uniqueness: { if: -> { name == 'ace' }
end
class User < ApplicationRecord
  validates :email, uniqueness: { unless: -> { name == 'ace' }
end

conditionsif/unless 모두 sql 조건을 걸 수 있다. 그럼 둘의 차이는 무엇일까? conditions의 경우에는 where쿼리만 가능하고 ==, !=와 같은 연산자를 사용할 수 없어서 if/unless가 좀 더 범용성 있게 사용할 수 있을 것 같다.

대소문자 구분

case_sensitive의 값을 true로 지정하면 대소문자를 구분한다.

class User < ApplicationRecord
  validates :email, uniqueness: { case_sensitive: true }
end

allow_nil, allow_blank

allow_nil : 속성이 nil인 경우 유효성 검사를 하지 않는다.
allow_blank : 속성이 공백이면 유효성 검사를 하지 않는다.
특정 컬럼이 공백이나 nil을 허용하고 값이 있을 때만 유효성 검사를 하고 싶을 때 사용하면 좋을 것 같다.

참고

profile
Ruby on Rails 개발하고 있는 서버 개발자입니다.

0개의 댓글