2010/2/23 Daniel Cadenas <[email protected]>: > Los gatitos se van al cielo, a Dios le gustan los gatitos, matemos gatitos > para alegrar a Dios.
Fah, te vas a arriesgar a que Dios y el Cielo no existan, y que todos esos gatitos mueran en vano :S Mirá que sos cruel, eh? Pobres gatitos :( > 2010/2/23 Nicolás Sanguinetti <[email protected]> >> >> Y, la solución obvia—y correcta—es la que vos terminaste haciendo. >> Migrá la base de datos y hacé la columna not null y con default 0. >> >> def self.up >> change_column :movements, :debit, :integer, :null => false, :default => 0 >> change_column :movements, :credit, :integer, :null => false, :default => >> 0 >> end >> >> Ahí pasa a funcionar solo :) >> >> Si no, la siguiente mejor solución (si no podés tocar la base de >> datos, por ejemplo), es decirle a rails que el campo ese siempre sea >> un integer, sin importar el valor en la base de datos: >> >> class ClientMovement < ActiveRecord::Base >> def debit >> read_attribute(:debit).to_i >> end >> end >> >> Y seguiría funcionando transparentemente -- movements.sum(&:debit) >> devolvería lo que querés sin necesidad de hacer nada en la vista. >> >> Pero ta, si el cambio pasa en la base, mucho mejor. >> >> Hacer el casteo o filtrado en las vistas cada vez que necesitás el >> valor es una grosería :) >> >> Sobre el query en sí, ActiveRecord te da un API "relativamente" >> elegante (según cómo se lo mire) para no tener que escribir SQL a >> mano. En particular, lo que vos querés, es hacer JOIN con un par de >> tablas y filtrar por una condición, y quedaría así: >> >> ClientMovement.all(:joins => [:inquiry, :client], :conditions => { >> "clients.id" => params[:id] }) >> >> Entre otras cosas, esto te evita el SQL injection que te mencionaron, >> y es mucho más fácil de leer. (El valor de :joins asume que >> ClientMovement tiene una asociación "belongs_to :client" y "belongs_to >> :inquiry". En caso de que fueran has_many, lo que le pasás es el >> nombre de la asociación, por lo que sería :joins => [:inquiries, >> :clients]) >> >> Y finalmente, habrás visto que los ejemplos de código los escribo en >> inglés. Cada vez que alguien mezcla idiomas distintos en código, se >> muere un gatito. Vos no querés que se mueran gatitos, verdad? >> >> POR FAVOR, ESCRIBAN EL CÓDIGO EN UN SÓLO IDIOMA. >> >> O hacen un interprete de ruby donde las palabras clave y constantes, >> etc están en español (clase Arreglo < Objeto; fin), o escriben todo el >> código en inglés. Pero es horriblemente molesto leer código en idiomas >> mezclados. >> >> Saludos, >> -foca >> >> PD: Mirá la documentación de ActiveRecord::Base#read_attribute (y ya >> que estás, write_attribute) para entender cómo funciona la segunda >> solución. Y la de ActiveRecord::Base.find para ver las opciones qué le >> podés pasar, así no tenés que hacer find_by_sql. >> >> >> 2010/2/22 Nestor Rodriguez <[email protected]>: >> > Hola gente, como andan, aqui peleandome con el array, estoy tratando de >> > hacer un sistema de cuentas corrientes y estoy con eso del DEBITO Y EL >> > CREDITO, así que necesito mostrar el ESTADO DE CUENTAS de un cliente, >> > por lo >> > tanto en el CONTROLADOR escribo esto: >> > >> > @clientes_movimientos = ClienteMovimiento.find_by_sql("Select >> > clientes_movimientos.* " + >> > "from clientes_movimientos, solicitudes, clientes " + >> > "where clientes_movimientos.solicitud_id = >> > solicitudes.id >> > and " + >> > " solicitudes.cliente_id = clientes.id and " + >> > " clientes.id = #{params[:id]}") >> > AQUÍ NO ESTA EL PROBLEMA, el problema es que en el array que me genera, >> > vienen dos campos, DEBITO y CREDITO, que quiero sumarlos (cada uno un su >> > columna) para mostrar los totales algo así como: >> > >> > fec mov Concepto Debito Credito Fec >> > vencimiento Num cuota Observacion >> > 22/02/2010 Cuota 300,000 02/02/2010 1/4 >> > debito automatico >> > 22/02/2010 Cuota 200,000 02/04/2010 2/4 >> > debito automatico >> > 22/02/2010 Cuota 200,000 02/05/2010 3/4 >> > debito automatico >> > 22/02/2010 Cuota 200,000 02/06/2010 4/4 >> > debito automatico >> > TOTAL 1,000,000 0 >> > >> > Lo que pasa es que el campo CREDITO, como no se le cargo nada tiene >> > valores >> > nulos, ahora bien mi pregunta es la siguiente: >> > Como le digo a un bloque, que si es nulo el campo, lo tome como 0 >> > (cero). >> > Algo así como >> > >> > @clientes_movimientos.sum {|cm| ifnull(cm.debito,0)} >> > @clientes_movimientos.sum {|cm| ifnull(cm.credito,0)} >> > >> > Obviamente la funcion ifnull no es de ruby que yo sepa. Pero cuando le >> > coloco de la forma que aprendí es decir así: >> > @clientes_movimientos.sum {|cm| cm.debito} >> > @clientes_movimientos.sum {|cm| cm.credito} >> > >> > Me lanza un error ya que cm.credito es nulo y no lo puede sumar. >> > >> > Alguien sabe una función que transforme un valor nulo aquí en por >> > ejemplo 0 >> > (cero). >> > >> > Desde ya gracias... >> > >> > Néstor R. >> > >> > >> > >> > _______________________________________________ >> > Ruby mailing list >> > [email protected] >> > http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar >> > >> _______________________________________________ >> Ruby mailing list >> [email protected] >> http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar > > > _______________________________________________ > Ruby mailing list > [email protected] > http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar > > _______________________________________________ Ruby mailing list [email protected] http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
