Pb Xapian/Xapit

Bonjour,

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

** Invoke xapit:index (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute xapit:index
Indexing Archive
rake aborted!
undefined method find_each' for #<Class:0x102ee9af0> /Users/nicolas/.gem/ruby/1.8/gems/activerecord-2.1.2/lib/active_record/ base.rb:1672:inmethod_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' /Library/Ruby/Gems/1.8/gems/xapit-0.2.7/lib/xapit/adapters/ active_record_adapter.rb:17:infind_each’
/Library/Ruby/Gems/1.8/gems/xapit-0.2.7/lib/xapit/index_blueprint.rb:
77:in index_all' /Library/Ruby/Gems/1.8/gems/xapit-0.2.7/lib/xapit/index_blueprint.rb: 15:inindex_all’
/Library/Ruby/Gems/1.8/gems/xapit-0.2.7/lib/xapit/index_blueprint.rb:
13:in each' /Library/Ruby/Gems/1.8/gems/xapit-0.2.7/lib/xapit/index_blueprint.rb: 13:inindex_all’
/Library/Ruby/Gems/1.8/gems/xapit-0.2.7/lib/xapit.rb:10:in `index_all’

A noter que cette erreur persiste même si je désactive will_paginate.

Une idée?

Merci
Nicolas


Vous avez reçu ce message, car vous êtes abonné au groupe “Railsfrance” de
Google G…
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.

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 :slight_smile:
(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 B.,
il peut se le permettre, Jamis B. 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 G…
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.

Merci Jean François pour cette longue explication.

Pour l’instant j’ai tout simplement mis le module batches dans un
initializers et je l’ai inclu dans AR

class ActiveRecord::Base
include Batches
end

Et ça a l’air de marcher.

Nicolas
PS: je comprends très bien le “n’utilisez pas un plugin que vous ne
sauriez coder” et maintenant je regarde toujours le code d’un plugin,
mais ça reste de la théorie. Je n’aurais pas été capable d’écrire
Rails et pourtant je l’utilise, je ne sais pas bricoler une voiture et
pourtant je conduis, …


Vous avez reçu ce message, car vous êtes abonné au groupe “Railsfrance” de
Google G…
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.

Le 12 avril 2010 19:01, Tranquiliste a écrit :

Hello,

PS: je comprends très bien le “n’utilisez pas un plugin que vous ne
sauriez coder” et maintenant je regarde toujours le code d’un plugin,
mais ça reste de la théorie.

J’ai retrouvé la citation sur son blog :

http://weblog.jamisbuck.org/2007/2/21/review-build-your-own-ruby-on-rails-web-applications

"It (= le bouquin, il parle d’un livre) shows how to implement
a basic user authentication system without resorting to
plugins! Far, far too many newcomers to Rails jump on
the user-auth plugin bandwagon, which leads to cargo-culting.
My advice is: never use a plugin you would not be able to
write yourself. "

Dans les commentaires, il rajoute cette précision intéressante :

“Andy, a plugin is a world apart from a framework. I’d never
recommend people know how to write the OS they are
using, either. However, I can’t tell you how many times
I’ve had people email or IM me asking me for help on
some little glitch, only to find out it is because of some
quirk in a plugin they are using. Plugins are not frameworks;
by using plugins like black boxes, you are crippling
yourself and setting yourself up for problems down
the road.”

Comme je l’ai dit, son propos est un peu excessif, mais
il donne à réfléchir.

Je n’aurais pas été capable d’écrire Rails et pourtant
je l’utilise, je ne sais pas bricoler une voiture et
pourtant je conduis, …

L’analogie avec la voiture est judicieuse et je l’utilise aussi.
Mais je pense que ça va un peu plus loin, il faut pousser
la métaphore.

ça se rapproche plus de :

  • soit tu as une voiture que tu modifies à ta sauce, tu fais
    du bolidage [1].

  • soit t’es ingénieur / mécanicien et tu travailles sur
    une Formule 1, une barquette pour Le Mans, une voiture
    de rallye, ce que tu veux…

C’est à dire que tu choisis ou pas (houba ! [2]) de
changer le moteur d’origine (MongoMapper à la place
d’ActiveRecord ?), tu décides de tout, des gommes,
de la taille du réservoir, de l’aéro, du réglage des ailerons,
l’anti-roulis, les suspensions, la répartition des masses,
etc.

Tu n’es pas qu’un simple conducteur, tu conçois ta
propre voiture, ta propre appli Rails.

Ce qui veut dire que pour concevoir ta Formule 1
qui soit rapide et fiable (pas de panne/bug), on est
déjà bien d’accord, c’est qu’il faut connaître les lois
de la mécanique générale (soit ici les technos du web,
HTML, CSS, HTTP, JavaScript, SQL, cookies,
sécurité, RSS, Ajax, etc) et celles spécifiques
à une Formule 1. En effet, entre concevoir un tracteur
(PHP ?) et une Formule 1 (Rails ?), c’est pas exactement
la même chose, même si au fond, les principes sont
les mêmes.

Ne pas bien connaître le SQL, c’est une erreur, on est
d’accord ? même si Rails t’aide à t’en affranchir et
à en écrire au maximum.

Sinon on va un peu modifier l’analogie, on va
dire que Rails c’est le moteur et tu ne sais pas faire
les moteurs, c’est à dire que t’es plus McLaren
que Ferrari. Si t’as un moteur de tondeuse à
gazon, tu seras jamais en pole ça c’est clair.
Inversement si tu as un bon moteur, ça ne suffit pas,
car il y a tout le reste, le chassis, le pneu, l’aéro, etc.
En gros, tu peux être motorisé par Rails (Ferrari ?)
et te retrouver en fond de grille parce qu’en fait t’as
conçu une brouette ou t’as des mauvais réglages.

McLaren, ils ont peut-être besoin de Ford, Mercedes
ou BMW pour faire avancer leur monoplace, ça ne
les empêche pas d’usiner leurs propres pièces mécaniques
s’il le faut.

Enfin bref,ça se rejoint car c’est de l’ingénierie, finalement.

– Jean-François.

1 : Hein ? Ouais du tuning, quoi.
2 : http://twitter.com/ou_pah


http://www.twitter.com/underflow_
http://www.rubyfrance.org

ça dépend.


Vous avez reçu ce message, car vous êtes abonné au groupe “Railsfrance” de
Google G…
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.