Buenas,
hoy nos hemos encontrado con un problema usando dos gemas de excel.
Usamos una para leer informes y otra para generarlos.
El problema es que ambas gemas tienen una clase Excel definida…
Existe alguna manera de especificar que clase Excel debe usar en cada
clase? Alguna manera de marcar el namespace o desambiguar las clases?
Gracias.
Si esperas un poco te llegara una repuesta buena. Pero si yo tuviera tu
problema y sólo conatase con mis escasoso conocimientos, probarÃa una
locura
del tipo hacer una clase mi que herede de una de las otras dos. Esta
clase
mi tendrÃa un nombre diferente…en mi cabeza tiene sentido. Pero
llevarlo a
la práctica es otra cosa.
Un saludo
El 24 de abril de 2009 8:45, Xurde F. <
[email protected]> escribió:
Perdón, por “clase mi” querÃa decir “clase mÃa”
El 24 de abril de 2009 9:59, Andrés gutiérrez
[email protected]escribió:
2009/4/24 Xurde F. [email protected]:
Buenas,
hoy nos hemos encontrado con un problema usando dos gemas de excel.
Usamos una para leer informes y otra para generarlos.
El problema es que ambas gemas tienen una clase Excel definida…
Existe alguna manera de especificar que clase Excel debe usar en cada
clase? Alguna manera de marcar el namespace o desambiguar las clases?
El otro día leí un post justo sobre este tema:
http://blog.zerosum.org/2009/4/17/why-namespaces-are-important
La solución sería utilizar módulos para aislar cada clase excel dentro
de un namespace propio, lo que no sé es si en tu caso se puede hacer.
Tampoco nos das muchos detalles ¿qué gemas estás utilizando?
2009/4/24 Xurde F. [email protected]
El problema es que ambas gemas tienen una clase Excel definida…
Se me ocurren dos maneras diferentes de solucionarlo.
a) La primera es modificar las gemas, cosa poco recomendada si son gemas
que
se piensan actualizar. Para ello, vendorizarlas sobretodo, nada de
instalarlas en el sistema.
b) Tener dos procesos. En uno cargas una y en otro cargas otra, y les
pones
ha hablar como amigos mediante drb(preferiblemente socket).
Explico un poco más esta segunda.
En la app cargo la gema de solo lectura, y esta se conecta al “demonio”
drb
y le pasa los parámetros para construir el excel.
Ambas soluciones creo que son válidas, la segunda me parece más
divertida y
más limpia, además de poder generar excels con una api clara y definida.
Además, tienes la ventaja (que no se si será el caso), de poder el
servidor
drb a escuchar en tcp, y tienes un generador de excel con una api
publica en
ruby para toda la red.
Creo que serÃan las dos soluciones más elegantes.
Un Saludo.
–
Guillermo Ãlvarez
Sent from Madrid, Comunidad de Madrid
El día 24 de abril de 2009 11:20, Guillermo [email protected]
escribió:>
2009/4/24 Xurde F. [email protected]
El problema es que ambas gemas tienen una clase Excel definida…
Seguramente las gemas tengas la clase dentro de un módulo por lo que
se le podrá invocar utilizando la cadena de namespaces como indica
David A…
Qué gemas son?
f.
2009/4/24 Fernando G. [email protected]
Seguramente las gemas tengas la clase dentro de un módulo por lo que
se le podrá invocar utilizando la cadena de namespaces como indica
David A…
Te sorprenderÃas la de gemas que no hacen eso, y el peligro no está ahÃ,
sino cuando una gema que crees inofensiva, te sobreescribe métodos del
core.
No me acuerdo ahora, pero una vez me volvà loco buscando que pasaba, y
una
gema habÃa sobreescrito Object#to_s. No recuerdo el caso en concreto, ya
que
mi reciente cambio de edad me lo impide, pero por si acaso, y si tienes
dudas, revisa el código de una gema. Que al fin y al cavo, no sabes que
gema
puede contener un rootkit. Desconfia.
Lo de los namespaces, de vez en cuando pasa, y es una putada. Lo bueno
que
es que suele pasar en gemas antiguas(sin mucha actualización), ya que
las
nuevas y más brillantes, suelen traer todas el namespace correspondiente
al
nombre de la gema, o por lo menos un nombre único, lo hace técnicamente
imposible el solapamiento de clases.
Gracias por todas las soluciones. Al final lo arreglamos gracias a que
una de las gemas si venia en forma de modulo y aprovechamos para usar el
namespace, la otra venia definida como un clase y poco que hacer con
ella…