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.
