Paginate avec des conditions sur les clés etrangères

Bonjour à tous, je rencontre un problème pour paginer sous rails Ã
partir du moment ou je souhaite définir des conditions par rapport au
clés etrangères de ma table.

J’ai une table “Hotel” et une table “Ville”, un Hotel est implanté dans
une ville, on a donc un champ “ville_id” dans Hotel.
Mes modèles et relations Active Record sont correctement en place et on
peut faire hotel.ville.nom pour récuper le nom de la ville dans laquelle
l’hotel est implanté.

Cependant je ne sais pas comment paginer les hotels dont on préciserait
le nom de la ville.

J’utilise cette syntaxe :
paginate :hotels , :order => ‘id’, :per_page => 10, :conditions xxxxx
Où je ne sais pas quoi mettre dans conditions pour lui dire de
selectionner les hotels dont la vile est “paris” par exemple.

Une idée ?

On 7/1/07, Cédric B [email protected] wrote:

le nom de la ville.

J’utilise cette syntaxe :
paginate :hotels , :order => ‘id’, :per_page => 10, :conditions xxxxx
Où je ne sais pas quoi mettre dans conditions pour lui dire de
selectionner les hotels dont la vile est “paris” par exemple.

Une idée ?

Il faut penser un peu en SQL. Il faut commencer par un join :

:join => ‘INNER JOIN villes ON villes.id = hotels.ville_id’

En suite il faut dire la condition :

:conditions => [‘villes.name = ?’, ‘paris’]

Par contre attention la pagination est en cours de déprécation. Ainsi
dans la future version de Rails la 1.2.4, l’objet Pagination n’existe
pas. il faudra utiliser un plugin.


Cyril M.

Merci beaucoup je vais tester ca.

On 7/2/07, Jean-François Trân [email protected] wrote:

@hotels_pages, @hotels = paginate_collection @ville.hotels,
:per_page => 10,
:page => params[:page]

Nan très très mauvaise perf ici, cette technique est à éviter IMHO, ca
charge toute la collection en mémoire à chaque pagination donc ca tuera
n’importe quel serveur dès qu’on a une grosse collection (Paris m’a tué
?).

Renaud

Cédric :

Cependant je ne sais pas comment paginer les hotels dont on préciserait
le nom de la ville.

J’utilise cette syntaxe :
paginate :hotels , :order => ‘id’, :per_page => 10, :conditions xxxxx
Où je ne sais pas quoi mettre dans conditions pour lui dire de
selectionner les hotels dont la vile est “paris” par exemple.

Tu peux utiliser la méthode paginate_collection définie ici :

http://snippets.dzone.com/posts/show/389

ce qui te permet d’écrire :

@ville = Ville.find :first,
:include => :hotels,
:conditions => [ ‘name = ?’ , ‘Paris’ ]

@hotels_pages, @hotels = paginate_collection @ville.hotels,
:per_page => 10,
:page => params[:page]

Il est intéressant aussi de regarder les autres systèmes de
pagination (paginating_find, will_paginate…)

– Jean-François.


Ruby ( http://www.rubyfrance.org ) on Rails ( http://www.railsfrance.org
)

Le 02/07/07, renaud morvan[email protected] a écrit :

@hotels_pages, @hotels = paginate_collection @ville.hotels,
:per_page => 10,
:page => params[:page]

Nan très très mauvaise perf ici, cette technique est à éviter
IMHO, ca charge toute la collection en mémoire à chaque
pagination donc ca tuera n’importe quel serveur dès qu’on a une
grosse collection (Paris m’a tué ?).

L’OP voulait utiliser #paginate, càd le système de pagination
inclus dans Rails ; #paginate_collection n’est ni meilleur, ni
plus mauvais, puisqu’il utilise exactement la même technique.
Si on n’est pas gêné par les inconvénients de #paginate concernant
les performances, on ne le sera pas avec #paginate_collection.

De plus, ce n’est pas pour rien que j’ai rajouté : “Il est intéressant
aussi de regarder les autres systèmes de pagination
(paginating_find, will_paginate…)”

– Jean-François.


Ruby ( http://www.rubyfrance.org ) on Rails ( http://www.railsfrance.org
)