레코드가 없을 때 nil과 함께 find ()
내 현재 레일 프로그램에서 다음과 같은 것을 사용할 때
user = User.find(10)
ID = 10 인 사용자가 없으면 다음과 같은 예외가 발생합니다.
ActiveRecord::RecordNotFound: Couldn't find User with ID=10
예외를 발생시키는 대신 nil을 얻을 수 있으므로 다음과 같이 할 때 :
unless user = Challenge.find(10)
puts "some error msg"
end
레코드가 없을 때 nil을 얻고 싶고 begin / rescue를 사용하고 싶지 않습니다.
감사
네, 그냥하세요 :
Challenge.find_by_id(10)
Rails 4 및 5의 경우 :
Challenge.find_by(id: 10)
Rails 4에서는 find_by_id수락 된 답변에 사용 된 것과 같은 동적 파인더 가 더 이상 사용되지 않습니다.
앞으로는 새 구문을 사용해야합니다.
Challenge.find_by id: 10
ActiveRecord 쿼리 인터페이스를 사용하면됩니다.
이것은 Exception을 발생시키는 대신 nil을 반환합니다.
User.where(:id => 10).first
단순히 예외를 포착하지 않는 이유는 무엇입니까? 귀하의 사례는 다음과 같은 예외 사항과 정확히 일치합니다.
begin
user = User.find(10)
rescue ActiveRecord::RecordNotFound
puts "some error msg"
end
복구 블록의 오류에서 복구하려면 (예 : 자리 표시 자 사용자 (null 패턴) 설정)이 블록 아래에서 코드를 계속 사용할 수 있습니다. 그렇지 않으면 "begin"과 "rescue"사이의 블록에 "happy case"에 대한 모든 코드를 넣을 수 있습니다.
당신은 이것을 시도 할 수 있습니다 Challenge.exists?(10)
mongoid로 어려움을 겪는 사람들을 위해 레일 버전에 관계없이 find및 find_by메소드 모두 예외를 발생 시키는 것으로 나타났습니다 !
false로 설정할 수 있는 옵션 (즉 raise_not_found_error )이 있지만 falsey로 인해 find메서드가 예외를 발생시키지 않습니다.
따라서 몽고 이드 사용자를위한 해결책은 역겨운 코드입니다.
User.where(id: 'your_id').first # argghhh
다음과 같이 간단합니다.
user = User.find(10) rescue nil
필요한 속성 (귀하의 경우 id)과 함께 find_by를 사용할 수 있습니다. 주어진 ID를 찾을 수없는 경우 오류를 제공하는 대신 nil을 반환합니다.
user = Challenge.find_by_id(id_value)
또는 새로운 형식을 사용할 수 있습니다.
user = Challenge.find_by id: id_value
where를 사용할 수도 있지만 0 개 이상의 레코드가있는 활성 레코드 관계를 반환하는 위치를 알아야합니다. 먼저 하나의 레코드 만 반환하거나 0 개 레코드가 반환되는 경우 nil을 사용해야합니다.
user = Challenge.where(id: id_value).first
참고 URL : https://stackoverflow.com/questions/9604585/find-with-nil-when-there-are-no-records
'IT박스' 카테고리의 다른 글
| Objective-C의 읽기 전용 속성? (0) | 2020.09.09 |
|---|---|
| 행 내부의 TextField로 인해 레이아웃 예외 발생 : 크기를 계산할 수 없음 (0) | 2020.09.09 |
| 레일에서 열 유형을 더 긴 문자열로 변경 (0) | 2020.09.09 |
| 싱글 톤이 나쁘면 서비스 컨테이너가 좋은 이유는 무엇입니까? (0) | 2020.09.08 |
| Mac에서 $ PATH에 / usr / local / bin을 추가하는 방법 (0) | 2020.09.08 |