특성이 완벽하게 저장되었지만 유효성 검사가 올바르게 작성 되었음에도 불구하고 레일스가 모델의 특성의 고유성을 검증하지 않는 bizzarre 글리치가 있습니다. content_hash
이 방법으로 모델의 다른 속성에서 생성 된 속성이레일스 : 이전 레코드를 찾지 못하는 고유성 유효화
validates :content_hash, :presence => true, :uniqueness => true
라고 :
는이 코드와 함께, 내 레일 모델 중 하나,Spark
에서 값의 고유성을 보장하기 위해 검증을 추가
before_validation
콜백을 사용합니다. Rails 콘솔을 사용하여 유효성 검사 전에이 해시가 실제로 만들어 졌음을 확인 했으므로 문제가되지 않습니다. 나는 충돌이
content_hash
에 존재 알고있는 불꽃에 레일 콘솔
spark.valid?
에 전화
는 콘솔은이 쿼리를 실행 한 것을 저에게 말한다 :
Spark Exists (0.2ms) SELECT 1 AS one FROM "sparks" WHERE "sparks"."content_hash" = '443524b1c8e14d627a3fadfbdca50118c6dd7a7f' LIMIT 1
을 그리고 방법은 것을 반환 개체가 유효합니다. 유효성 검사기가 완벽하게 작동하고 있으며 content_hash
의 고유성을 검사하기 위해 올바른 쿼리를 실행하고있는 것 같습니다. 문제는 대신 데이터베이스 끝에 있습니다 (sqlite3을 사용하고 있습니다). 사실에도 불구하고,
SELECT "sparks".* FROM "sparks" WHERE "sparks"."content_hash" = '443524b1c8e14d627a3fadfbdca50118c6dd7a7f'
기이은이 쿼리는 데이터베이스에서 아무 것도 반환하지 않습니다 난 내 자신과 함께 볼 수 : 나는 충돌이 정말이 쿼리를 사용하여 존재하는지 확인하기 위해 데이터베이스 나 자신을 확인하기로 결정 때문에 나는 이것을 알고 이 content_hash
이있는 다른 레코드가 테이블에 있습니다.
어떤 이유로 인해이 테이블의 다른 특성에 대해 유사한 쿼리를 실행할 때 출력이 올바르므로 테이블의 특성 인 content_hash
에만 존재하는 문제입니다. 내 schema.rb
파일의 관련 부분에서 볼 수 있듯이
content_hash
열은 예상대로 작업을 다른 사람과 다르지 않다 :
create_table "sparks", :force => true do |t|
t.string "spark_type"
t.string "content_type"
t.text "content"
t.text "content_hash"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
end
이 문제에 어떤 도움이 많이 주시면 감사하겠습니다; 나는이 일로 머리를 찢을 준비가되어있다.
': uniqueness => : true'에서'true '라는 단어 앞에 콜론이있는 오타가 있습니까? –
그래, 그건 단지 미안한 질문이있는 오타였습니다. 내 코드에는 콜론이 없습니다. – maxluzuriaga
content_hash와 같이 'select * from sparks'에서 '44 % '와 (과) 같이 말할 필요가있는 것은 무엇입니까? –