2013-05-31 5 views
0

특성이 완벽하게 저장되었지만 유효성 검사가 올바르게 작성 되었음에도 불구하고 레일스가 모델의 특성의 고유성을 검증하지 않는 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 

이 문제에 어떤 도움이 많이 주시면 감사하겠습니다; 나는이 일로 머리를 찢을 준비가되어있다.

+0

': uniqueness => : true'에서'true '라는 단어 앞에 콜론이있는 오타가 있습니까? –

+0

그래, 그건 단지 미안한 질문이있는 오타였습니다. 내 코드에는 콜론이 없습니다. – maxluzuriaga

+0

content_hash와 같이 'select * from sparks'에서 '44 % '와 (과) 같이 말할 필요가있는 것은 무엇입니까? –

답변

0

그래, 문제를 해결할 수있었습니다. content_hash의 유형을 text 열에서 string 열로 변경하면 모든 것이 완벽하게 작동하기 때문에 sqlite3 문제라고 생각합니다. 기묘한.

관련 문제