Consulta SQL

1 view
Skip to first unread message

Martin Trejo

unread,
Jan 27, 2009, 2:12:18 PM1/27/09
to mx...@googlegroups.com, ruby-s...@googlegroups.com
Hola lista,

Ando atorado con lo siguiente:

Necesito obtener un COUNT de la base de datos, la sentencia SQL original es la siguiente:

select centro_id, month(fecha_factura) as mes_factura, year(fecha_factura) as year_factura, count(*) as count_facturas 
from facturas 
where guia_id = 3 group by centro_id,  month(fecha_factura), year(fecha_factura)

Lo que me devuelve esta consulta es el siguiente resultado
centro_id, mes_factura, year_factura, count_facturas
7213 1 2009 7
7692 2 2008 1

Que es el número de facturas por centro_id y por mes y año de la factura.

La primera opción que se ocurrió fue usar el método count de las Calculations, como en lo sigte:

>> facturas_count = Factura.count(:select => 'centro_id,fecha_factura', :conditions => {:guia_id => 3}, :group => 'centro_id,fecha_factura')

luego se me ocurrió usar count_by_sql, como en lo sigte:

>> facturas_count = Factura.count_sql('select centro_id, month(fecha_factura) as
 mes_factura, year(fecha_factura) as year_factura, count(*) as count_facturas fr
om facturas where guia_id = 3 group by centro_id,  month(fecha_factura), year(fe
cha_factura)')

pero tampoco devuelve los resultados esperados

Ya en la desesperancia usé esto:

>> facturas_count = Factura.find_by_sql('select centro_id, month(fecha_factura)
as mes_factura, year(fecha_factura) as year_factura, count(*) as count_facturas
from facturas where guia_id = 3 group by centro_id,  month(fecha_factura), year(
fecha_factura)')

Y el resultado, si me sirve, pero no es el modo correcto. ¿alguien me puede ayudar a hacer esto de la manera correcta con AR?

Como referencia, la aplicación corre con Rails 1.2.6 (si ya sé, ya sé), SQL Server 2000 sobre un Windows Server 2000.

Saludos y gracias de antemano.,

Martín Trejo Chávez

Manuel Vidaurre

unread,
Jan 27, 2009, 3:52:59 PM1/27/09
to ruby-s...@googlegroups.com
Estimado Martín,

Creo que debes de replantear donde estan las responsabilidades de que en tu aplicación. Según lo que entiendo es que necesitas obtener es el número de facturas por centro, mes y año, la pregunta es ¿qué modelo tiene la responsabilidad de responder a esta información? En mi opinión esa es una responsabilidad del Centro y no de la Factura por lo que te suguiero que hagas un refactoring.

Dado que me imagino tienes algo así:
class Centro < ActiveRecord::Base
  has_many :facturas
end

class Factura < ActiveRecord::Base
  belongs_to :centro
end

Mi sugerencia es que añadas un método al modelo Centro de la siguiente forma:

def numero_de_facturas_por_mes_fecha
  facturas.count(:group => 'fecha_factura')
end

el método te regresa un Array con la fecha y el número de facturas para esa fecha.

De esta forma para obtener lo que quieres harias un:
Centro.find(3).numero_de_facturas_por_mes_fecha

No he probado el código por lo que puede que tenga algún error, pero creo que es como yo lo enfocaría.

Saludos

Manuel

2009/1/27 Martin Trejo <chilli...@gmail.com>

Martin Trejo

unread,
Jan 27, 2009, 5:08:49 PM1/27/09
to ruby-s...@googlegroups.com
Gracias Manuel!

Ya probé el código y funciona. :D

Pues mira, desgraciadamente el espacio no es tanto como para explicar todo el caso. También concuerdo en que parte del tema tiene que ver con la separación de responsabilidades y el punto es que como es costumbre, hay todavía más historia detrás de todo esto.

De cualquier manera, la idea de contabilizar (count) a través de las relaciones me ha ayudado y veré la forma de aplicarlo al problema que tengo.

Saludos,

Martín Trejo Chávez

2009/1/27 Manuel Vidaurre <manuel....@gmail.com>

Manuel Vidaurre

unread,
Jan 27, 2009, 5:13:51 PM1/27/09
to ruby-s...@googlegroups.com
Perdón tengo un error, por que lo deseas tener agurpado por guía. Aquí la pregunta es si el modelo de Guía lo tienes asociado al Centro o a la Factura o a ambos.

Saludos

Manuel


2009/1/27 Manuel Vidaurre <manuel....@gmail.com>

Martin Trejo

unread,
Jan 27, 2009, 5:16:08 PM1/27/09
to ruby-s...@googlegroups.com
Si, noté la omisión pero es por lo mismo del espacio.

El modelo Guía está asociado con varios Centros y éstos últimos  a las Facturas.

Saludos,

Martín Trejo Chávez

2009/1/27 Manuel Vidaurre <manuel....@gmail.com>
Perdón tengo un error, por que lo deseas tener agurpado por guía. Aquí la pregunta es si el modelo de Guía lo tienes asociado al Centro o a la Factura o a ambos.

Manuel Vidaurre

unread,
Jan 27, 2009, 5:38:56 PM1/27/09
to ruby-s...@googlegroups.com
Ahh.. entoces la responsabilidad es de la Guía y puedes hacer incluirle un metodo como el del Centro pero de la siguiente forma:

En el modelo de Guia

def numero_de_facturas_por_mes_fecha_de_cada_centro
  centros.collect{|c| {:centro_id => c.id, :facturas => c.facturas.count(:group => 'fecha_factura')}}
end

Y así ya puedes hacer:

Guia.find(3). numero_de_facturas_por_mes_fecha_de_cada_centro

Y te da un hash con los centros y sus numeros de facturas por mes

Pruebalo.

Paco Viramontes

unread,
Jan 27, 2009, 6:07:16 PM1/27/09
to ruby-s...@googlegroups.com
Manuel que rubistame saliste con tu nombre de funcion excesivamente descriptivo jajaja

pero te la pongo mejor porque no haces un metodo dinamico que esponda a

self.send("numero_de_#{que}_por_#{agrupador}_de_ #{filtro}")

o una monkey parchada asi mas loca jajajaja

Paco

2009/1/27 Manuel Vidaurre <manuel....@gmail.com>

Martin Trejo

unread,
Jan 27, 2009, 6:51:00 PM1/27/09
to ruby-s...@googlegroups.com
Gracias por el código... Lo estoy probando y usando algunas otras variaciones.

Manuel Vidaurre

unread,
Jan 27, 2009, 7:05:36 PM1/27/09
to ruby-s...@googlegroups.com
Pues mi Paco no es mala idea o podria usarse metaprogramming con missing_method

;-)

Y que ondas contigo, muy trabajoso... Martin viene para GDL yo voy a Colima el jueves pero regreso el mismo día. Por lo que creo que sería bueno que nos vieramos el viernes hay que ver si nos podemos coordinar para ir al Sabora pero tenemos que llegar temprano por que no hay reservaciones.

Saludos

Manuel

2009/1/27 Paco Viramontes <kidp...@gmail.com>

Paco Viramontes

unread,
Jan 27, 2009, 9:01:05 PM1/27/09
to ruby-s...@googlegroups.com
Chale he estado super desconectado, estuve como loco  teniendo listo un sistemita para el H gobernador que no tenia tiempo de nada jajaja no sabia que martin venia ahhhmm pos yo estoy puestazo martin buscame cuando andes por aca 


PAco

Paco Viramontes

unread,
Jan 27, 2009, 9:01:27 PM1/27/09
to ruby-s...@googlegroups.com
SABORA YUMM!!!!!
On Jan 27, 2009, at 6:05 PM, Manuel Vidaurre wrote:

Federico Soria

unread,
Jan 28, 2009, 1:24:49 AM1/28/09
to Ruby SIG Mexico
Mejor venganze a Monterrey, deja de hacerte del rogar Paco! jaja

On Jan 27, 8:01 pm, Paco Viramontes <kidpo...@gmail.com> wrote:
> SABORA YUMM!!!!!
> On Jan 27, 2009, at 6:05 PM, Manuel Vidaurre wrote:
>
>
>
> > Pues mi Paco no es mala idea o podria usarse metaprogramming con  
> > missing_method
>
> > ;-)
>
> > Y que ondas contigo, muy trabajoso... Martin viene para GDL yo voy a  
> > Colima el jueves pero regreso el mismo día. Por lo que creo que  
> > sería bueno que nos vieramos el viernes hay que ver si nos podemos  
> > coordinar para ir al Sabora pero tenemos que llegar temprano por que  
> > no hay reservaciones.
>
> > Saludos
>
> > Manuel
>
> > 2009/1/27 Paco Viramontes <kidpo...@gmail.com>
> > Manuel que rubistame saliste con tu nombre de funcion excesivamente  
> > descriptivo jajaja
>
> > pero te la pongo mejor porque no haces un metodo dinamico que  
> > esponda a
>
> > self.send("numero_de_#{que}_por_#{agrupador}_de_ #{filtro}")
>
> > o una monkey parchada asi mas loca jajajaja
>
> > Paco
>
> > 2009/1/27 Manuel Vidaurre <manuel.vidau...@gmail.com>
> > Ahh.. entoces la responsabilidad es de la Guía y puedes hacer  
> > incluirle un metodo como el del Centro pero de la siguiente forma:
>
> > En el modelo de Guia
>
> > def numero_de_facturas_por_mes_fecha_de_cada_centro
> >   centros.collect{|c| {:centro_id => c.id, :facturas =>  
> > c.facturas.count(:group => 'fecha_factura')}}
> > end
>
> > Y así ya puedes hacer:
>
> > Guia.find(3). numero_de_facturas_por_mes_fecha_de_cada_centro
>
> > Y te da un hash con los centros y sus numeros de facturas por mes
>
> > Pruebalo.
>
> > Saludos
>
> > Manuel
>
> > 2009/1/27 Martin Trejo <chilli.co...@gmail.com>
> > Si, noté la omisión pero es por lo mismo del espacio.
>
> > El modelo Guía está asociado con varios Centros y éstos últimos  a  
> > las Facturas.
>
> > Saludos,
>
> > Martín Trejo Chávez
>
> > 2009/1/27 Manuel Vidaurre <manuel.vidau...@gmail.com>
> > Perdón tengo un error, por que lo deseas tener agurpado por guía.  
> > Aquí la pregunta es si el modelo de Guía lo tienes asociado al  
> > Centro o a la Factura o a ambos.
>
> > Saludos
>
> > Manuel
>
> > 2009/1/27 Manuel Vidaurre <manuel.vidau...@gmail.com>
> > 2009/1/27 Martin Trejo <chilli.co...@gmail.com>

Martin Trejo

unread,
Jan 28, 2009, 10:53:24 AM1/28/09
to ruby-s...@googlegroups.com
Hola a todos los rieleros de Charrolandia, 

Hoy a lo largo del día se define mi agenda para mañana y pasado, en cuanto tengo definido todo me pongo en contacto con uds.

Saludos,

Martín Trejo Chávez

2009/1/28 Federico Soria <fede...@gmail.com>

Manuel Vidaurre

unread,
Jan 28, 2009, 11:34:34 AM1/28/09
to ruby-s...@googlegroups.com
Paco,
 
Que tal como vas con ActiveWarehouse? Yo estoy analizando de integrarlo a un proyecto que tenemos.

Manuel Vidaurre

unread,
Jan 28, 2009, 11:36:01 AM1/28/09
to ruby-s...@googlegroups.com
Que tal Federico, tanto tiempo. Pues es que no invitas, ya sabes que estamos dispuestos a asesorar a los compañeros, por una modica lanita ;->

Ya en serio que onda con usted Señor? se ha desaparecido completamente del mapa.

Saludos

Manuel

2009/1/28 Federico Soria <fede...@gmail.com>

Martin Trejo

unread,
Jan 28, 2009, 4:43:27 PM1/28/09
to ruby-s...@googlegroups.com
Hola,

Por cuestiones de pre$upue$to se cambió la fecha del viaje a GDL :(

Espero que por la semana del 9 de feb andar por allá, ojalá y haya oportunidad de encontrarnos.

Saludos,

Martín Trejo Chávez

2009/1/28 Manuel Vidaurre <manuel....@gmail.com>

Manuel Vidaurre

unread,
Jan 29, 2009, 12:54:41 AM1/29/09
to ruby-s...@googlegroups.com
Ok, pues nos avisas... Saludos

2009/1/28 Martin Trejo <chilli...@gmail.com>

Paco Viramontes

unread,
Jan 29, 2009, 5:03:38 PM1/29/09
to ruby-s...@googlegroups.com
Pues ya esta en produccion el sistema, fue todo un reto porque no esta nada documentado y lo que hay es muy viejo, la libreria es muy buena pero para poder aprobecharla hay que sentarse a leer el codigo.

Se va a seguir ampliando pero como sistema base quedo bastante bien, usuarios felices jiji

PAco

2009/1/28 Manuel Vidaurre <manuel....@gmail.com>

Federico Soria

unread,
Jan 30, 2009, 5:03:16 AM1/30/09
to Ruby SIG Mexico
Pues no desapareci tanto aqui sigo dando lata preguntale a Paco jaja
de hecho hiciste falta en Obbie Conf estuvo muy buena!
Tengo poco en Monterrey, hace como 4 meses cambie mi base de
operaciones para aca y pues estamos en proceso de expansión como
siempre buscando talento Ruby. Pero pues como siempre estamos a sus
servicios, por otra modica lanita ;->
También ya preparandonos para RailsConf en Vegas, va a estar muy
bueno!

On Jan 28, 10:36 am, Manuel Vidaurre <manuel.vidau...@gmail.com>
wrote:
> Que tal Federico, tanto tiempo. Pues es que no invitas, ya sabes que estamos
> dispuestos a asesorar a los compañeros, por una modica lanita ;->
> Ya en serio que onda con usted Señor? se ha desaparecido completamente del
> mapa.
>
> Saludos
>
> Manuel
>
> 2009/1/28 Federico Soria <fedeso...@gmail.com>

Jose Castaneyra

unread,
Jan 30, 2009, 10:22:09 AM1/30/09
to ruby-s...@googlegroups.com
Hola compañero, una pregunta, talvez algo indiscreta, pero como te estás organizando para el RubyConf? cuánto planeas gastarte entre boletos de avión, hospedaje y entradas al RubyConf?

La verdad me gustaría ir, pero no tengo ni la más mínima idea de todo lo que implique, bueno, para empezar ni visa tengo aunque creo que habría tiempo como para irla a tramitar, pero lo que si es un hecho como bien lo dices es que de seguro va a estar muy bueno.

Saludos.
--
------------------------------------------------
M.T.I. José Juan Castaneyra Matus
SCJP, SCJD

Manuel Vidaurre

unread,
Jan 30, 2009, 7:11:27 PM1/30/09
to ruby-s...@googlegroups.com
Pues si, me la perdí. Lo que pasa es que estaba complicadisimo de fechas. Pero a RailsConf si voy. Ya estoy preparando todo.

Saludos

Manuel

2009/1/30 Federico Soria <fede...@gmail.com>

Manuel Vidaurre

unread,
Jan 30, 2009, 7:15:07 PM1/30/09
to ruby-s...@googlegroups.com
Pues Excelente! haber si luego me das un demo, hay que poner en marcha lo del Ruby SIG Guadalajara aunque nos reunamos una vez al mes pero para presentar algunas de las cosas interesantes que se esten haciendo para enriquesernos. Vas a BarCamp? Yo estoy casi seguro de ir, por que lo estoy combinando con un viaje al DF ya que tenemos un proyecto de apoyo para C4 en el área de Seguridad Pública.

Saludos

Manuel

2009/1/29 Paco Viramontes <kidp...@gmail.com>

Paco Viramontes

unread,
Jan 30, 2009, 7:23:57 PM1/30/09
to ruby-s...@googlegroups.com
Siii hay que reunirnos!!!!!

acabo de ir al sabora jajaj me acorde de ti. Pues no se que es barcamp pero si te puedo hacer un demo a la discre ya hay que poner fecha a la reunion.

PAco

2009/1/30 Manuel Vidaurre <manuel....@gmail.com>

Manuel Vidaurre

unread,
Jan 31, 2009, 12:04:49 AM1/31/09
to ruby-s...@googlegroups.com
Para que esten enterados:

Es el 7 de Febrero en Queretaro

Saludos

Manuel

2009/1/30 Paco Viramontes <kidp...@gmail.com>
Reply all
Reply to author
Forward
0 new messages