다음은 모델입니다 (SQLLite3 사용 중).
class School < ActiveRecord::Base
validates_uniqueness_of :name
end
예를 들어 "Yale"을 추가 한 후 "Yale"을 추가 할 수 없지만 "yale"을 추가 할 수 있습니다. 유효성 검사 대소 문자를 구분하지 않으려면 어떻게해야합니까?
편집 : 발견- 활성 레코드 유효성 검사
다음은 모델입니다 (SQLLite3 사용 중).
class School < ActiveRecord::Base
validates_uniqueness_of :name
end
예를 들어 "Yale"을 추가 한 후 "Yale"을 추가 할 수 없지만 "yale"을 추가 할 수 있습니다. 유효성 검사 대소 문자를 구분하지 않으려면 어떻게해야합니까?
편집 : 발견- 활성 레코드 유효성 검사
답변:
validates_uniqueness_of :name, :case_sensitive => false
트릭을 수행하지만 다중 서버 / 서버 프로세스 (예 : Phusion Passenger, 다중 Mongrel 등 실행) 또는 다중 스레드 서버가있는 경우 고유성을 보장 validates_uniqueness_of
하지 않는다는 점을 명심해야 합니다. 다음과 같은 일련의 이벤트를 얻을 수 있기 때문입니다 (순서가 중요합니다).
insert
새 레코드에 대한 명령문을 제출 하고 성공합니다.insert
새 레코드에 대한 명령문을 제출 하고 SQL 어댑터에서 돌아 오는 추악한 서버 예외로 실패 합니다. 데이터베이스 제약 조건이없는 경우 삽입이 성공하고 이제 이름이 'foo'인 두 행이 있습니다.validates_uniqueness_of
Rails 문서의 "동시성 및 무결성"을 참조하십시오 .
에서 레일 3 판 루비 :
... 이름에도 불구하고 validates_uniqueness_of는 열 값이 고유하다는 것을 보장하지 않습니다. 할 수있는 일은 유효성 검사를 수행 할 때 유효성을 검사하는 레코드의 값과 동일한 값이있는 열이 없는지 확인하는 것뿐입니다. 고유해야하는 열에 대해 동일한 값을 가진 두 레코드가 동시에 생성되고 두 레코드 모두 유효성 검사를 통과 할 수 있습니다. 고유성을 적용하는 가장 신뢰할 수있는 방법은 데이터베이스 수준 제약을 사용하는 것입니다. "
참고 이 프로그래머의 경험 과를 validates_uniqueness_of
.
일반적으로 이런 일이 발생하는 한 가지 방법은 새 계정을 만들 때 웹 페이지에서 실수로 이중 제출을하는 것입니다. 사용자가 다시 받게되는 것은 두 번째 (추악한) 오류이고 실제로 성공했을 때 등록이 실패했다고 생각하게 만들기 때문에 해결하기 어려운 문제입니다. 이를 방지하는 가장 좋은 방법은 이중 제출을 방지하기 위해 자바 스크립트를 사용하는 것입니다.
Rails 3에서는 모델에서이를 수행 할 수 있습니다.
validates :name, :uniqueness => true
또는 case_sensitivity없이
validates :name, :uniqueness => {:case_sensitive => false}
비슷한 질문이 있지만 대답이 더 흥미 롭습니다 : https://stackoverflow.com/a/6422771
기본적으로 using :case_sensitive => false
은 매우 비효율적 인 데이터베이스 쿼리 를 수행합니다.