2013-09-20 2 views
1

활성 레코드로 인해 혼란 스럽습니다. 즉, 중지 할 때마다 쿼리가 실행됩니다. 나는이 같은 쿼리를 구축하려는 경우 괜찮지 만, 무엇활성 레코드가 여러 단계로 쿼리를 생성합니다.

@model.where(:store_id => @sid) 

: 조회를

query = @model.where(:store_id => @sid) 

if(some_condition) 
    query.offset(50) 

를 한 후 실행은 (실제로 내가 일을하지만 아주 간단한 예 아니에요 것). 쿼리를 단계별로 조합 한 다음 실행하도록 지시하는 방법이 있습니까?

+1

나는 당신이 의미하는 것은, 그냥 루비를 마지막으로 식을 평가 리턴 할 것 액티브 문제가 아닙니다 생각합니다. 그래서 당신이 작성한 조건문이 있다면 그것은 마지막 복합 질의 만 실행합니다. – Fenec

+0

@Fenec 제게는 그것이 의미가 있다는 것을 잘 모르겠지만 사실 인 것 같습니다. – Will

답변

2

이것은 이미 원하는대로 작동합니다.

where()ActiveRecord::Relation의 인스턴스를 반환합니다.

릴레이션은 필요할 때까지 데이터베이스 호출을 실행하지 않습니다. 그렇지 않은 이유는 콘솔에서 테스트하여 각 명령문의 출력을 인쇄하므로 관계를로드하기 때문입니다. 관계가 loaded() 메소드를 통해로드되었는지 여부를 테스트 할 수 있습니다.

콘솔에서이 시도 :

m = @model.where(:store_id => @sid); # the semicolon will silence the output 

m.loaded? # nil 
m   # executes db call, will print out the contents of the relation 
m.loaded? # true 
3

사실, 액티브 당신이 원하는 정확히 무엇을 할 것입니다. 게으른 로딩이라고합니다. 레일 콘솔에서 혼란스러워 질 수 있습니다.이 콘솔은 회선 결과 화면 뒤에서 .inspect을 호출합니다.

체크 아웃이 질문은 : Lazy loading in Rails 3.2.6

관련 문제