[ruby-on-rails] 레코드가 없을 때 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