2010/4/12 Tranquiliste :

Hello,

> Je suis toujours dans mon installation/utilisation de xapian/xapit.
> J'ai pour l'instant suivi la doc de xapit  et je rencontre un problème
> quand j'execute rake xapit:index, j'ai une erreur
[...]
> Une idée?

Plusieurs remarques :

- Si l'erreur est toujours là quand tu désactives will_paginate,
c'est sûrement parce que ce n'est pas la faute de will_paginate.

- Si tu utilises le plugin will_paginate, il est judicieux - on en a
déjà parlé lors de Solutions Linux 2010 - comme tous les plugins
qu'on utilise dans son appli, de comprendre comment il fonctionne.

Notamment sur ce point :

will_paginate monkeypatche la classe ActiveRecord::Base
pour que celle-ci réponde à des passages de messages
comme "paginate_all_by_title", "paginate_by_title" par exemple.

Pour cela, will_paginate utilise la technique des familles bien
connue qui consiste à passer par la méthode method_missing
et y intercepter les messages dont le nom commence par "paginate",
puis les traiter à sa manière. Or AR::B a déjà sa magie et
implémente method_missing pour traiter notamment des dynamiques
finders comme find_all_by_*.

Du coup, will_paginate ressort un classique alias_method_chain
de derrière les fagots pour intercepter les messages paginate*
*avant* le method_missing original, les autres messages
comme find_all_by*, il refile le bébé à AR::B qui le traite
comme d'habitude.

Ceci explique la présence dans le traceback de méthodes
comme method_missing_without_paginate et
method_missing.

> /Users/nicolas/.gem/ruby/1.8/gems/activerecord-2.1.2/lib/active_record/
> base.rb:1672:in `method_missing_without_paginate'
> /Users/nicolas/Documents/Developpements/RoR/NotreImmeuble/vendor/gems/
> mislav-will_paginate-2.3.3/lib/will_paginate/finder.rb:164:in
> `method_missing'

Revenons au bug : tu appelles une méthode qui n'est pas
définie, ie AR::B ne répond pas à find_each, comme
AR::B répond à méthod_missing, ça passe d'abord dans
method_missing.

Donc on s'aperçoit que xapit appelle AR::B.find_each
qui n'est pas définie.

Or cette méthode est nouvelle depuis ActiveRecord 2.3
car ça a été intégrée pour faire du traitement par lots (par
batchs) ie quand on veut traiter tous les enregistrements
d'une table ou un resultset, il vaut mieux le faire par
tranches plutôt que de faire avant un AR::B.all, car
si t'as des centaines de milliers voire des millions
de tuples, tu vas le sentir au niveau de ton appli Rails :)
(par défaut, find_each charge en mémoire 1000 objets
AR::B à la fois).

- Maintenant cette ligne

> /Users/nicolas/.gem/ruby/1.8/gems/activerecord-2.1.2/lib/active_record/
> base.rb:1672:in `method_missing_without_paginate'

indique que tu utilises Rails 2.1.2 et donc c'est logique
qu'il ne trouve pas find_each car ça n'existait pas à l'époque
(ou l'équivalent existait dans le plugin Active Record Extensions,
par exemple)

- De plus, xapit fait une indexation via un #index_all et il est pas
con Jean-Pierre, car pour cela il fait un traitement par batch
et passe donc par AR::B.find_each

- Maintenant, comment résoudre ton pb ?

Et ben si tu regardes, find_each est défini dans batches.rb
dans Active Record. Et à vue de nez (mais je peux me tromper),
il ne semble pas être difficile à backporter pour 2.1
et si ça trouve même, quelqu'un l'a déjà fait (faut googler)
sous forme de plugin. Si ça n'a pas été fait, ça demande
juste un peu d'huile de coude pour le pluginiser, à vrai dire,
je n'arrive pas à voir ce qui pourrait poser problème.

- Dernière remarque, si on voit un plugin comme une boite
noire, tant que ça marche, tant mieux. Mais si on n'a pas
étudié le code du plugin avant, à terme ça peut poser
des pbs si on ne sait pas le débugger.

De manière un peu excessive, mais c'est Jamis Buck,
il peut se le permettre, Jamis Buck disait en gros :
"n'utilisez pas un plugin que vous ne sauriez coder"

L'idée de base est si tu utilises un plugin que tu ne
sauras pas plugin parce que tu n'as pas étudié son
fonctionnement, si tu sais pas le débugger, ya des
risques que tu vas pleurer ta mère/t'arracher les
cheveux pendant quelques jours.

Je dis ça, je dis rien.

   -- Jean-François.


-- 
http://www.twitter.com/underflow_

http://www.rubyfrance.org

-- 
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de 
Google Groups.
Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse 
[email protected]
Pour résilier votre abonnement envoyez un e-mail à l'adresse 
[email protected]

To unsubscribe, reply using "remove me" as the subject.

Répondre à