레일즈에서는 유효성 검사 중 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
또 if
나 unless
를 통해서도 할 수 있다.
class User < ApplicationRecord
validates :email, uniqueness: { if: -> { name == 'ace' }
end
class User < ApplicationRecord
validates :email, uniqueness: { unless: -> { name == 'ace' }
end
※ conditions
와 if/unless
모두 sql 조건을 걸 수 있다. 그럼 둘의 차이는 무엇일까? conditions
의 경우에는 where
쿼리만 가능하고 ==
, !=
와 같은 연산자를 사용할 수 없어서 if/unless
가 좀 더 범용성 있게 사용할 수 있을 것 같다.
case_sensitive
의 값을 true
로 지정하면 대소문자를 구분한다.
class User < ApplicationRecord
validates :email, uniqueness: { case_sensitive: true }
end
allow_nil
: 속성이 nil
인 경우 유효성 검사를 하지 않는다.
allow_blank
: 속성이 공백이면 유효성 검사를 하지 않는다.
특정 컬럼이 공백이나 nil을 허용하고 값이 있을 때만 유효성 검사를 하고 싶을 때 사용하면 좋을 것 같다.