[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로 어려움을 겪는 사람들을 위해 레일 버전에 관계없이 findfind_by메소드 모두 예외가 발생 한다는 것이 밝혀졌습니다 !

false로 설정할 수 있는 옵션 (즉 raise_not_found_error )이 있지만 falsey로 인해 find메서드가 예외를 발생시키지 않습니다.

따라서 몽고 이드 사용자를위한 해결책은 역겨운 코드입니다.

User.where(id: 'your_id').first # argghhh


답변

다음과 같이 간단합니다.

user = User.find(10) rescue nil