나는 다음과 같은 코드 블록이 : 당신이 아마 추측 할 수로, 그 여러 프로세스가 아무튼 경우 (사용자가 생성하는 동시에,이 메소드를 호출 할 수액티브 예외는 구출하지
unless User.exist?(...)
begin
user = User.new(...)
# Set more attributes of user
user.save!
rescue ActiveRecord::RecordInvalid, ActiveRecord::RecordNotUnique => e
# Check if that user was created in the meantime
user = User.exists?(...)
raise e if user.nil?
end
end
이유는,이다 't'가 이미 존재하기 때문에), 첫번째 블록이 블록에 들어가고 새로운 사용자의 초기화, 속성의 설정 그리고 마지막으로 save!를 호출하기 시작하면, 사용자는 이미 생성되었을 것이다. 그 경우에는 사용자가 존재하는지 다시 확인하고 여전히 예외가 발생하지 않는 경우에만 예외를 발생시킵니다 (= 그 동안에 다른 프로세스가 생성하지 않은 경우).
문제는 정기적으로 ActiveRecord :: RecordInvalid 예외가 저장에서 발생한다는 것입니다. 구조 블록에서 구조되지 않았습니다. 아이디어가 있으십니까?
편집 :
괜찮습니다. 이상합니다. 나는 뭔가를 놓치고 있어야합니다. 나는 같이하는 시몬의 팁에 따라 코드를 리팩토링 : 그것은 'user.save 않는'라는 라인에 던져
ActiveRecord::RecordNotUnique: Mysql::DupEntry: Duplicate entry 'f[email protected]' for key 'index_users_on_email': INSERT INTO `users` ...
:
unless User.find_by_email(...).present?
# Here we know the user does not exist yet
user = User.new(...)
# Set more attributes of user
unless user.save
# User could not be saved for some reason, maybe created by another request?
raise StandardError, "Could not create user for order #{self.id}." unless User.exists?(:email => ...)
end
end
지금 나는 다음과 같은 예외를 얻었다. 어떻게 그럴 수 있습니까? Rails는 전자 메일이 고유하지만 MySQL 고유 인덱스가 삽입을 방지하기 때문에 사용자를 만들 수 있다고 생각합니까? 그게 얼마나 가능성이 있니? 어떻게 피할 수 있습니까?
감사 :
는 여기에 우리의 간단한 이에 대한 링크의 페이지입니다! 나는 Devise를 인증에 사용하고 있으므로 User 모델에 고유성에 대한 유효성 검사가 포함되어 있으며 전자 메일에 고유 한 인덱스가 있습니다. 나는 내 코드를 리팩토링 할 수있다. begin user.save! 구조 ... 끝 에 다른 user.save 경우 ... 끝 하지만 난 내 원래의 질문에 더 관심이 있어요 : 왜 내 원래 캡처하지 않는 액티브 :: RecordInvalid 예외 암호? –