2017-03-01 2 views
0

고유 필드를 업데이트하지 않으므로 속성을 업데이트 할 수없는 이유는 무엇입니까?고유 한 현재 유효성 검사를 생성 또는 갱신하는 방법

urlmd5 둘 다 고유성 검증이 URL :

validates :url, presence: true, uniqueness: true 
validates :urlmd5, presence: true, uniqueness: true 

이 작품 :

ParserUrl.where(urlmd5: p[:urlmd5]).first_or_initialize.update_attributes!(
     user_id: item.user_id, parser_id: item.parser_id 
    ) 

이이 작품을하지 않습니다

ParserUrl.where(url: p[:url], urlmd5:p[:urlmd5]).first_or_initialize.update_attributes!(
     user_id: item.user_id, parser_id: item.parser_id 
    ) 

I got error 'unable to update existing record'... 

이 first_or_initialize.update_attributes입니다! 이걸 처리하는 올바른 방법?

+0

전체 오류를 정확하게 표시 할 수 있습니까? 또한이 문맥에서 정확히'p'는 무엇입니까? – Glyoko

+0

나는 url 또는 p [: urlmd5]의 값이 이미 있지만 urlmd5의 값은 모두 p [: url] 인 레코드를 가지고 있다고 생각합니다. 그래서 first_or_initialize는 둘의 조합을 찾지 못하기 때문에 두 가지 모두로 레코드를 초기화하지만 고유성 제약 조건은 필드 중 하나에 계속 적용됩니다. – SteveTurczyn

+0

두 필드를 모두 결합한 고유성을 원할 수 있습니까? 유효성 검사를 변경해야합니다. 'validates : urlmd5, 존재감 : true, 유일성 : {scope : : url} '그리고 반대의 경우도 마찬가지입니다. – SteveTurczyn

답변

0

문제는 first_or_initialize에 고유 한 값을 전달하지 않아 새로운 인스턴스가 만들어지면 고유성, 존재 여부 또는 둘 모두가 없어져서 실패했습니다.

ParserUrl.where(urlmd5: p[:urlmd5]). 
    first_or_initialize(url: p[:url].to_s, urlmd5: p[:urlmd5]). 
    update_attributes!(user_id: item.user_id, parser_id: item.parser_id) 

또 다른 방법은 레일 4 :

당신은 first_or_initialize하는 고유 값을 전달해야

ParserUrl.find_or_initialize_by(url: p[:url].to_s, urlmd5: p[:urlmd5]). 
    update_attributes!(user_id: item.user_id, parser_id: item.parser_id) 

2) 본 뜻 :

1) 만 DB를 한 번 공격 DB를 두 번 누르십시오 (바람직하지 않음).

ParserUrl.find_or_create_by!(url: p[:url].to_s, urlmd5: p[:urlmd5]). 
    update_attributes!(user_id: item.user_id, parser_id: item.parser_id)