2009-07-07 27 views
7

Khá chắc chắn rằng tôi thiếu một cái gì đó thực sự đơn giản ở đây:Sử dụng will_paginate với nhiều kiểu (Rails)

Tôi đang cố gắng hiển thị một loạt các trang có chứa hai mẫu khác nhau - Tiểu sử và Nhóm. Tôi cần họ đặt hàng bằng thuộc tính tên của họ. Tôi có thể chọn tất cả các trường hợp cho mỗi mô hình, sau đó sắp xếp và phân loại chúng, nhưng điều này cảm thấy cẩu thả và không hiệu quả.

Tôi đang sử dụng mislav-will_paginate và tự hỏi liệu có cách nào tốt hơn để đạt được điều này không? Một cái gì đó như:

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

sẽ là lý tưởng!

Trả lời

6

Câu hỏi hay, tôi gặp vấn đề tương tự vài lần. Mỗi lần, tôi đã kết thúc nó bằng cách viết truy vấn sql của riêng tôi dựa trên các công đoàn sql (nó hoạt động tốt với sqlite và mysql). Sau đó, bạn có thể sử dụng sẽ phân trang bằng cách chuyển các kết quả (http://www.pathf.com/blogs/2008/06/how-to-use-will_paginate-with-non-activerecord-collectionarray/). Đừng quên thực hiện truy vấn để đếm tất cả các hàng.

Một số dòng mã (không kiểm tra)

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}") 

Có overkilled? Có thể nhưng bạn có số lượng truy vấn và kết quả tối thiểu nhất quán.

Hy vọng điều đó sẽ hữu ích.

Lưu ý: Nếu bạn nhận được giá trị bù đắp từ một param http, bạn nên sử dụng sanitize_sql_for_conditions (ví dụ: sql injection ....)

0

Bạn đã thử hiển thị hai bộ kết quả khác nhau với các trình tạo trang riêng của chúng và cập nhật chúng thông qua AJAX chưa? Nó không phải là chính xác những gì bạn muốn, nhưng kết quả là tương tự.

+0

Thật không may là nó sẽ không cắt nó - tôi cần phải có hai tập hợp các trường hợp với nhau. – Codebeef

1

Bạn có thể lấy gần làm một cái gì đó như:

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

đó sau đó sẽ đánh số trang sử dụng các thông số trang profile_pagegroup_page. Bạn có thể lấy will_paginate cuộc gọi trong giao diện sử dụng đúng trang sử dụng:

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

Tuy nhiên, tôi không chắc chắn có một lợi ích lớn hơn thiết lập @groups@profiles riêng.

1

trong dự án cuối cùng của tôi bị mắc kẹt vào một vấn đề, tôi đã phải đánh số trang nhiều các mô hình có phân trang đơn trong chức năng tìm kiếm của tôi. nó sẽ hoạt động theo cách mà mô hình đầu tiên sẽ xuất hiện đầu tiên khi kết quả của mô hình thứ nhất mô hình thứ hai sẽ tiếp tục kết quả và thứ ba và cứ như là một nguồn cấp dữ liệu tìm kiếm, giống như nguồn cấp dữ liệu facebook. này là chức năng tôi tạo ra để làm chức năng này

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 

thử nó và cho tôi biết nếu bạn có bất kỳ vấn đề với nó, tôi cũng gửi nó như một vấn đề để will_paginate kho, nếu tất cả mọi người xác nhận rằng nó hoạt động một cách chính xác Tôi sẽ ngã ba và cam kết nó vào thư viện. https://github.com/mislav/will_paginate/issues/351

Các vấn đề liên quan