Bonjour,
Voilà 2 jours que je tente différentes alternatives pour mon problème. Il se trouve que j'ai une table assez conséquente (environ 4000 enregistrements) et que j'aimerais pouvoir rechercher rapidement à l'intérieur de celle-ci.
Dans mon application, en cliquant sur le bouton de recherche, une thickbox s'affiche contenant un champ de recherche et TOUT les éléments de ma table. Et quand on commence à taper dans le champ de recherche, ça me retourne les résultats au fur et à mesure. La pagination est hors de question, la recherche doit être quasiment instantanée. Pour le tri (car il y a du tri également) c'est pas mémorable niveau rapidité, mais ça peut passer (j'utilise le plugin tablesorter de jquery, si quelqu'un a une idée plus efficace).
Pour la recherche par contre, je peut dire que j'ai essayer pas mal de chose différente. Ma première idée, et c'est toujours celle que j'imagine la plus rapide, était de pouvoir rechercher dans ma collection. C'est à dire que j'aimerais faire :
En gros ! Seulement je n'ai rien trouvé là dessus sur Internet et en l'état, ça ne fonctionne pas. Soit j'ai un exception "wrong number of arguments" soit il ne m'affiche rien...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 def list <div style="margin-left:40px">@clients = Client.find(:all)</div>end def live_search <div style="margin-left:40px">@results = @clients.find(params[:search_value]</div><div style="margin-left:40px">render :update do |page|</div><div style="margin-left:40px"><div style="margin-left:40px">page.replace_html "mon_div", :partial => @clients</div></div><div style="margin-left:40px">end</div>end
Deuxième solution : on fait de l'ajax et chaque query est envoyé à la base. Mais dans ce cas là, il me fallait un truc rapide pour faire de la recherche dans du plain text. Première alternative : acts_as_ferret. Bof bof, ça marche pas top, l'indexation est bizarre, niveau rapidité c'est pas le nirvana, bref. Deuxième alternative : thinking_sphinx. Après un peu de difficulté à le mettre en place, c'est peut-être la solution la plus intéressante. Seulement sur 4000 enregistrements, ça reste assez long. Même si, évidemment, le temps de travail vient aussi du traitement des données récupérées (un simple requête postgres me prenant 200ms, Firebug lui, me dit que l'appel prend 600ms et l'affichage prends encore prêt d'une seconde...). Et comme j'ai eu d'autres problèmes avec thinking_sphinx (paging automatique, etc.) j'ai tenté une autre idée : la recherche en javascript. Après avoir essayer la librairie jquery quicksearch et un exemple de code qui ont,tous les deux, mis environ 10-15 secondes à me retourner un résultat (sur Safari, sur Firefox il me demandait si je voulais stopper le script), je suis en train de me dire que la recherche par JS c'est pas le top sur une grosse table.
Donc j'en reviens à mon idée de base : rechercher dans ma collection. Mais vous, vous avez des idées ? D'autres librairies JS, une possibilité d'optimisation, etc. Je fais déjà du page caching pour le chargement initial de ma liste, mais pour la recherche... Et sinon j'ai un peu regardé de la doc sur tsearch2 de postgres mais je sais pas trop comment le mettre en place...
Merci de votre aide (et félicitations à ceux qui m'ont lu jusqu'au bout !).
Partager