2013-01-08 2 views
2

시계 RailsCast video에서 익명 범위에 대해 배우고 있습니다. 나는 그것을 자신을 시도 할 때, 문처럼 보인다 :익명 범위 ActiveRecord

scope = User.scoped 

즉시 SQL 문을 사용하여 DB를 조회 : 나는 심지어 체인 조건에 기회가

User Load (3.2ms) SELECT `users`.* FROM `users` 

전에. 이것은 분명히 매우 비효율적이며 비디오의 저자가 그것을 할 때 일어나지 않습니다. 나는 무엇을 놓치고 있습니까?

또한 범위에서 내가 연쇄 조건을 수행했음을 알고 있으며 쿼리를 수행 할 시간이 있습니까?

+1

체인을 계속 사용하지 않아서가 아니라는 것을 확인하기 위해 체인 연결을 시도 했습니까? –

답변

2

콘솔에서 사용해 보시겠습니까?

scope = User.scoped 

console 시도가 마지막 문을 검사하고 쿼리를 트리거 : 문제는 당신이 입력하는 경우이다. 이를 방지하려면 끝에서 뭔가를 반환 :

scope = User.scoped; nil 

이 방법은 consolenil를 검사하고 아무것도 당신의 scope 변수에 변화가 없습니다. 아무도 당신이 그것을 정의한 직후에 그것을 검사하려고하지 않기 때문에 이것은 실제 코드에서 문제가되지 않을 것이다.

+0

아하나. 범위 변수가 실제로 쿼리로 변환 된 시점을 알 수 있습니까? – 0xSina

+0

데이터에 액세스하려고 할 때 (#all 호출, iterating 등) 다른 모든 작업은 게으르고 ActiveRecord :: Relation 만 반환해야합니다. –

1

나는 당신을 낙담하고 싶지 않지만 레일 4에서 scoped 메소드가 사용되지 않게 될 것이라고 확신합니다. 새 버전의 더욱 흥미로운 새 기능은 this RailsCast에서 논의됩니다.

관련 문제