2009-07-07 3 views
7

여기 정말 간단 뭔가 놓치고 있다는 확신 :사용 will_paginate

나는 두 개의 서로 다른 모델의 인스턴스 포함하는 일련의 페이지 표시하기 위해 노력하고있어 - 프로필 및 그룹. 이름 속성으로 주문해야합니다. 각 모델에 대해 모든 인스턴스를 선택하고 정렬 및 페이지 매김을 수행 할 수는 있지만 느슨하고 비효율적입니다.

나는 mislav-will_paginate를 사용하고 있으며이를 달성하는 더 좋은 방법이 있는지 궁금해하고 있습니까? 다음과 같이 입력하십시오 :

[Profile, Group].paginate(...) 

이상적입니다.

답변

6

좋은 질문입니다. 몇 번이나 같은 문제가 발생했습니다. 매번, 나는 그것을 자신의 SQL 쿼리를 SQL 유니온 (sqlite 및 mysql과 함께 잘 작동 함)을 기반으로 작성하여 종료했다. 그런 다음 결과를 전달하여 페이지 매기기를 사용할 수 있습니다 (http://www.pathf.com/blogs/2008/06/how-to-use-will_paginate-with-non-activerecord-collectionarray/). 쿼리를 수행하여 모든 행을 계산하는 것을 잊지 마십시오. 코드의

일부 라인은

my_query = "(select posts.title from posts) UNIONS (select profiles.name from profiles)" 
total_entries = ActiveRecord::Base.connection.execute("select count(*) as count from (#{my_query})").first['count'].to_i 

results = ActiveRecord::Base.connection.select_rows("select * from (#{my_query}) limit #{limit} offset #{offset}") 

이 overkilled되어 (테스트하지)? 아마 당신은 질의의 최소 수를 얻었고 결과는 일관성이 있습니다.

희망이 있습니다.

주 : HTTP의 PARAM에서 오프셋 값을 얻을 경우, 당신은 sanitize_sql_for_conditions를 사용해야합니다 (예 : SQL 인젝션 ....) 내가 문제에 붙어 내 마지막 프로젝트

0

두 개의 다른 결과 집합을 고유 한 페이지 매기기로 표시하고 AJAX를 통해 업데이트하려고 시도한 적이 있습니까? 정확히 원하는 것은 아니지만 그 결과는 비슷합니다.

+0

불행히도 그것을 자르지는 않을 것입니다. 두 인스턴스를 함께 사용해야합니다. – Codebeef

1

당신은 가까운 같은 일을 얻을 수 있습니다 :

@profiles, @groups = [Profile, Group].map do |clazz| 
    clazz.paginate(:page => params[clazz.to_s.downcase + "_page"], :order => 'name') 
end 

다음 페이지 매개 변수를 profile_pagegroup_page를 사용하여 페이지를 매기는 것입니다. 당신은 사용하여 올바른 페이지를 사용하여보기에서 will_paginate 전화를받을 수 있습니다

<%= will_paginate @profiles, :page_param => 'profile_page' %> 
.... 
<%= will_paginate @groups, :page_param => 'group_page' %> 

을 아직도, 개별적으로 @groups@profiles을 설정 비해 큰 이점이있다 확실하지 않다.

1

, 내가 가지고 여러 페이지를 매기하기 내 검색 기능에서 단일 페이지 매김 모델. 첫 번째 모델의 결과가 두 번째 모델에서 결과를 계속 표시하고 세 번째 모델이 페이 지 피드처럼 하나의 단일 검색 피드로 나타날 때 첫 번째 모델이 먼저 나타나야하는 방식으로 작동해야합니다. 모두가 제대로 작동하는지 확인하는 경우 이 내가

def multi_paginate(models, page, per_page) 

    WillPaginate::Collection.create(page, per_page) do |pager| 

    # set total entries 
    pager.total_entries = 0 
    counts = [0] 
    offsets = [] 
    for model in models 
      pager.total_entries += model.count 
      counts << model.count 
      offset = pager.offset-(offsets[-1] || 0) 
      offset = offset>model.count ? model.count : offset 
      offsets << (offset<0 ? 0 : offset) 
    end 

    result = [] 
    for i in 0...models.count 
      result += models[i].limit(pager.per_page-result.length).offset(offsets[i]).to_a 
    end 

    pager.replace(result) 
    end 

end 

그것을 시도하고 당신이 그것으로 어떤 문제가 있으면 알려 주시기이 기능을 수행하기 위해 만든 기능이다, 나는 또한, 저장소를 will_paginate하는 문제로 게시 나는 그것을 포크로 사서 도서관에 맡기겠다. https://github.com/mislav/will_paginate/issues/351