2016-08-31 3 views
0

나는이 코드가 작동하는 데 매우 가깝지만 뭔가 간단하게 빠져 있어야합니다.Sequel :: Model paginate/each_page는 데이터의 첫 번째 페이지 만 반환합니다.

필자는 sequel :: model을 사용하여 추상화 한 일련의 teradata 및 oracle 테이블을 보유하고 있습니다. 필자는 데이터베이스에 페이지 매김 확장을로드했습니다. 반환 된 데이터 집합을 가져올 수는 있지만 내가하는 일과 상관없이 첫 번째 페이지가 아닌 다른 것을 제공 할 수는 없습니다.

다음은 Ive가 테이블을 추상화 한 예입니다. 여기

module MyDB 
    class MyTable< Sequel::Model(tera_db["#{$env[:my_db]}__my_table".to_sym]) 
     @factory_name = :my_factory 
     set_primary_key [:my_primary_key] 
     @typecast_on_assignment = false 
    end 
end 

는 필자가 데이터 세트에 87,675 레코드가 each_page

MyDB::MyTable.order(:my_primary_key).each_page(1000) do |page| 
    p page.current_page_record_count 
    p page.count 
    p page.first 
end 

주위에 몇 가지 테스트 코드를 구현하는 방법이다. 이 루프에서 마지막 두 번 반복 출력은 :

1,000

1,000

값 = {KEY1 => 12,345 : 키 2 => 14.58 : KEY3 => 155.44}

675

1,000

값 = {KEY1 => 12,345 : 키 2 => 14.58 : KEY3 => 155.44}

그래서 적절한 페이지 수가 생성됩니다. 페이징 된 레코드의 기본 개수가 정확합니다. 그러나 페이지에서 실제 값을 가져 오려고하면 레코드 수를 포함하여 첫 페이지의 레코드 만 가져옵니다.

무엇이 누락 되었습니까?

답변

0

page.first은 데이터 집합에서 오프셋을 제거하고 있습니까? 나는 당신의 결과를 재창조 할 수 없다. 테라 데이타 어댑터 (Sequel 자체의 일부가 아닌 외부 어댑터)에 문제가있을 수 있습니다. 당신은

+0

감사 제레미 ... 내 시도의 궁극적 인 목적에서 (당신은 아마 tera_db.loggers << Logger.new($stdout)를 사용하여 생성 할 수 있습니다)는 SQL 로그를 page.from_self.first, 또는 page.limit(1).all[0]을 시도하고 결과가 다른 경우 볼뿐만 아니라, 게시 할 수 있습니다 페이지 매김 (pagination)을 사용하면 큰 데이터 세트를 한번에 메모리에로드하지 않고도 롤업 할 수있었습니다. 정규 데이터 세트에서 .each를 사용하여이 작업을 수행 할 수 있기 때문에 페이징을 사용할 필요가 없습니다. 나는 이것이 테라 데이타 어댑터의 문제 일 가능성이 있음에 동의한다. –