2010-03-29 12 views
15

Dans mon application Rails, je souhaite utiliser la gemme will_paginate pour paginer sur ma requête SQL. Est-ce possible? J'ai essayé de faire quelque chose comme ça mais cela n'a pas fonctionné:Est-il possible de combiner will_paginate avec find_by_sql?

@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') 

Si non, est ce que tu peux le contourner? Je ne veux pas avoir à écrire ma propre pagination.

Répondre

46

utilisation paginate_by_sql, à savoir

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) 

En règle générale, toute page peut être paginée en remplaçant le find* avec paginate*.

-2

Essayez ceci:

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

Qu'est-ce que will_paginate et rails version utilisez-vous?

+5

Dans votre solution, est appliquée sur la pagination du jeu de résultat renvoyé par le 'find_by_sql' . Il se peut donc que vous ayez à faire face à un grand ensemble de résultats et que le système doive donc effectuer un calcul redondant. –

+0

Merci pour l'entrée. –

-2

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

+0

per_page Indiquez combien sont affichés dans chaque page –