2014-01-27 2 views
3

개체를 '만들기'전에 레코드가 있는지 확인하는 가장 좋은 방법은 무엇입니까?레코드가있는 경우 변수를 설정하는 방법

@tag = Tag.find_by_name(tag) 
if @tag 
do_something 
else 
do_something_else 
end 

당신은 할 수 있습니다 :

if @tag = Tag.find_by_name(tag) 
do_something 
else 
do_something_else 
end 
+0

첫 번째 접근 방식을 좋아합니다. –

답변

10

두 버전은 완벽하게 정상입니다. 후자를 사용하는 것이 매우 일반적입니다. 간결하기 때문입니다. 그러나, 가독성을 위해, 당신이 필요하지 않습니다

if (@tag = Tag.find_by_name(tag)) 

사용할 수 있습니다, 그러나 당신이 할당이 아닌 비교를하고 있다는 것을 더 명시합니다.

if @tag == Tag.find_by_name(tag) 

괄호 안에 넣는 것이 더 명확합니다. 그 결과를 지정하고 평가합니다. 실제로 태그 객체 자체를 필요로하지 않으며, 당신은 단지 존재를 돌보는 경우가 SELECT COUNT SQL 쿼리를 사용하기 때문에

또한, 당신은이 빠르다 exist?

if Tag.exists?(name: tag) 

사용할 수 있습니다 전체가 아닙니다 SELECT. 기본적으로 레코드를 인스턴스화하지 않습니다.

+1

+1 조건부 테스트에서 지정하는 것은 대기 중 유지 관리 버그입니다. 사람들은 C와 Perl에서 그렇게하지만 주석이 없으면 다른 사람들이 비교 대신 과제로지지된다는 것을 이해하지 못할 수도 있습니다. 이전 단계에서 할당 한 다음 비교하는 것이 좋습니다. 그러면 의도가 무엇인지 훨씬 더 분명하게 알 수 있습니다. –

+0

감사합니다. Simon. Tag.exists? (name : tag) 나와 Tag에 근무했습니다. (name : tag). 존재합니까? 하지 않았다. 왜 구문의 차이가 있습니까? – grabury

+0

구문이 변경되었을 수 있으므로 API를 살펴보아야합니다. –

관련 문제