2010-07-25 3 views
1

0의 리턴이 좋으면 종속 레코드를 찾을 때 nil에 대해 트래핑하는 것이 지긋합니다. NilClass에 "id"를 추가하여 어떤 종류의 문제가 발생합니까?NilClass 정의

class NilClass 
    def id 
    0 
    end 
end 

의도하지 않은 결과는 어떻게 될 수 있습니까? 나는 존재에 대해 안다?(). 그러나 어떻게 든 이것이 더 깨끗할지도 모른다라고 생각했다.

의견이 있으십니까?

+1

... "0"을 확인하는 것이 'nil'을 확인하는 것이 더 좋습니다. –

+0

오마르가 제안한 것처럼 사용해보십시오. –

답변

1

정말로 문제가있는 경우 데이터베이스 내부에서 참조 무결성을 사용해야합니다. 당신이 존재하거나 존재 또는 어떤 종류의 오류가 발생하지 않을 수있다 전무에 메소드를 호출해야하는 경우

, 당신은 라 ActiveSupport의 일부가

> nil.id if nil 
=> nil 

또는 Object#try이 (요즘 내가 믿는 수표 중 하나를 사용해야합니다 ?), 경고한다 - 나는 그것이 코드 냄새의 종류라고 생각한다. 말했다되고 그건

> nil.try(:id) 
=> nil 

, 그것은 예기치 않은 무언가를 당신의 프로젝트를 수행했다 새로운 개발자가 기대하는 것을 생각 NilClass을 수정하는 것보다 냄새가 덜합니다.

+0

"프로젝트에서 작업해야하는 새로운 개발자가 기대할 수있는 것을 생각해보십시오." 탁월한 질문! – Paul

+0

오마르 - 당신은 Object # try로 올바른 방향으로 나를 지적했다. 나는 zero-to-zero를 선호하는 경우에 "object.id.to_i"라고 쓰고있다. – Paul

+0

내가 여기서 도움을 주어서 기쁘다. 내가 생각한 실제적인 수정은 참조 무결성 수정이다! 그렇게하면 일대일 관계가 아니면 않는 한 존재하지 않는 객체를 다루지 않아도됩니다. –

1

존재를 확인하려면 "id == 0"을 확인해야합니까? Ruby의 기본 기능을 뛰어 넘는 의도하지 않은 결과는 말할 것도없고 언어 내부를 엉망으로 만들 때 다른 라이브러리 및 핵심 Rails API의 동작을 예측하기가 정말 어려워집니다. 그것은 단지 작동하지 않을 것이라고 말하는 것이 아니라 이 확실합니다.

저는 기본값을 그대로 두었습니다. Ruby가 "if object.association"표현식을 허용하기 때문에 아주 잘 작동합니다.

관련 문제