2010-03-29 26 views
15

Trong ứng dụng Rails của tôi, tôi muốn sử dụng đá quý will_paginate để phân trang trên truy vấn SQL của tôi. Điều đó có thể không? Tôi đã thử làm một cái gì đó như thế này nhưng nó không hoạt động:Có thể kết hợp will_paginate với find_by_sql không?

@users = User.find_by_sql(" 
    SELECT u.id, u.first_name, u.last_name, 
    CASE 
     WHEN r.user_accepted =1 AND (r.friend_accepted =0 || r.friend_accepted IS NULL) 
     .........").paginate(
        :page => @page, :per_page => @per_page, 
        :conditions => conditions_hash, 
        :order => 'first_name ASC') 

Nếu không, bạn có thể giới thiệu cách này không? Tôi không muốn phải viết phân trang của riêng mình.

Trả lời

46

Sử dụng paginate_by_sql, ví dụ:

sql = " SELECT * 
     FROM users 
     WHERE created_at >= '#{2.weeks.ago}' 
     ORDER BY created_at DESC " 
@users = User.paginate_by_sql(sql, :page => @page, :per_page => @per_page) 

Theo nguyên tắc chung bất kỳ công cụ tìm có thể được đánh số trang bằng cách thay thế find* với paginate*.

-2

Hãy thử điều này:

@users = User.find_by_sql 
@users = @users.paginate 

phiên bản will_paginate gì và đường ray bạn đang sử dụng?

+5

Trong giải pháp của bạn, pagination được áp dụng trên các tập kết quả trả về bởi các 'find_by_sql' . Vì vậy, bạn có thể phải đối phó với một tập kết quả lớn và do đó hệ thống phải thực hiện tính toán dư thừa. –

+0

Cảm ơn bạn đã nhập. –

-2

User.paginate_by_sql (sql,: page => params [: Trang],: per_page => 10)

+0

per_page cho biết số lượng hiển thị trong mỗi trang –

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