2014-02-11 4 views
0

간단하게하려고 노력한다. Model.all.page(1)
.page가 호출 될 때마다, 그것은 SQL COUNT 호출을 만든다. (실제 코드는 위의 코드보다 복잡하지만 읽기가 쉽도록 단순화되었습니다.) .page가 SQL 개수를 호출하지 못하게하는 방법이 있습니까? 나는 수백만 개의 제품을 다루고 있는데,이 호출은 페이지 새로 고침을로드하는 데 2 ​​초가 걸리게하는 것입니다. 나는 이미 내 자신의 커스텀 카운트를 가지고 있으므로이 페이징 카운트는 필요 없다.레일즈 .page 모델 호출 또한 count를

편집 : Def .all을 사용하지 마십시오. 나쁜 예가 미안해. 기본적으로 내 한마디에 코드

Heres는 정말 간단한 예 : 내 진짜 코드를 SQL로 Product.limit(1).page(1)

는 생산 : (1495.3ms) SELECT COUNT(*) FROM 'products' LEFT OUTER JOIN...

내가 가진 내가 할 필요가없는 제품의 테이블에 조인 따라서 내가 사용하고자하는 자체 카운트 방법이 있으며 실제로 .page를 생성하지 않아도됩니다.

+0

을 직접'page' 방법을 사용하는 이유는 무엇입니까? 일반적으로'paginate' 메소드를 사용합니다. will_paginate가 사용할 수있는 다른 메소드를 제공하면': total_entries' 옵션을 사용하여이를 전달할 수 있습니다. 'Model.paginate (: page => 1, : total_entries => 50)' –

+0

당신이 생각하는 진술 문에 의해 COUNT 쿼리가 생성되지 않았는지 확실히 확인하십시오. 페이지 매김과 관련된 내용이지만 다른 문구 일 가능성이 있습니다. 너에게 페이지 매김을 만들기 위해 총 페이지 수를 계산하려고하는 것. 전체 이슈를 #page 호출까지 100 % 추적 했습니까? 그렇다면 어떻게? –

+0

@HeliosdeGuerra, .page와 .per_page 옵션을 모두 전달할 수 있습니다. 둘 다 페이지 매김 결과를 제공하지만 모두 COUNT 쿼리 결과가됩니다. TanelSuurhans 글쎄, 내가 Product 또는 User 또는 Model.limit (1) .page (1)를 수행 할 때 SQL COUNT 호출을 삽입하는 데 100 % 그것이 추적되었다고 말할 것입니다.나는 그것을 추적 할 다른 방법을 모른다. 내가 Model.page (1)을 수행하더라도 질의 된 정보와 함께 sql 카운트를 반환하지만 모든 제품 (디버깅하는 동안 분명히 피할 수 있음)을 처리한다. –

답변

2

Model.all.page(1)을 호출하면 ActiveRecord 관계 대신 배열이 반환됩니다.

Model.page(1)를 호출 시도하고 당신은 당신이 원하는 것을 ... 당신이 원하는 것은 경우 얻어야한다 :

Model.page(1) 

# results in SELECT "models".* FROM "models" LIMIT 30 OFFSET 0 

편집 : 그래서 문제가 호출되었을 때 will_paginate 보석에 었죠 질의를 계산하여 정확한 총 페이지 수를 얻을 수 있도록 전체 항목 수를 파악합니다. 그러나 will_paginate는 사용자가 total_entries 카운트를 전달할 수있는 방법 인 paginate에 옵션을 제공합니다.이 테이블은 방대한 테이블을 가지고 있고 쿼리와 일치하는 모든 레코드에 대해 정확한 페이지 수를 얻지 않아도 유용합니다.

당신과 같이 옵션에 전달할 수 있습니다 :

Model.paginate(:page => params[:page], :per_page => 30, :total_entries => 100) 
+0

My DB에는 수백만 개의 제품이 있으므로 테스트를 위해 .limit (1)을 추가해야합니다. 그래서 Product.limit (1) .page (1) (본질적으로 코드와 동일), SQL 수를 제공합니다 : '(57.6ms) SELECT COUNT (*) FROM 'products'' 원하는/필요 없다 –

+0

흠, 나는 당신의'page' 메쏘드가 페이지 매김 보석에서 온다고 가정합니까? 예 : will_paginate 또는 kaminari? –

+0

그래, 기본 'will_paginate'보석을 필요로하는 보석 'bootstrap-will_paginate'를 사용합니다. –

1

당신은 COUNT 쿼리를하는 것에 관심을 가지고 있지만, Model.all을 통해 데이터베이스의 모든 레코드를 선택하고 있습니까? 너 지금 농담하는거야? 또한 도움을 받으려면 코드를 제공해야합니다. 우리는 당신의 마음을 읽을 수 없습니다, 당신은 어떤 코드를 가질 지 모릅니다. 특히 "내 실제 코드가 위보다 복잡합니다"라고 말할 때 특히 그렇습니다. 문제를 단순화 시키거나 코드가 숨어 있다고 생각하지 마십시오.

코드의 모양은 무엇입니까? 로그의 모양은 무엇입니까? 특히 쿼리 시간과 총 페이지 시간 (렌더링 및 ActiveRecord가 분리됨). 더 많은 정보를 제공해야합니다.

+0

질문을 업데이트했습니다. 업데이트는 내가 제공 할 수있는만큼의 코드를 가지고 있으며, 독점적이므로 코드를 제공 할 수 없습니다. 그러나 위의 내용은 본질적으로 같습니다. .page가 SQL count를 호출하는 것을 원하지 않는다. –

+0

레일즈 4라면 모든 레코드를 선택하지 않을 것이다. –