El Grillo
 
 

Uno

El Controlador:

   def uno
      @grid = Grillo.new
      @grid.add_column('last_name')
      @grid.add_column('name')
      @grid.add_column('login')
      @grid.add_column('password')
      @grid.fill_from_database(DemoTable)
   end
     	

La Vista:

   	<%= render_grid @grid %>
	

El grillo en su mínima expresión. Va a desplegar datos de la tabla DemoTable, mostrando un par de columnas.

 
 

Dos

El Controlador:

   def dos
      @grid = Grillo.new
      @grid.add_column('id_externo',     :align=>:center)
      @grid.add_column('hora_recep_bo',  :header=>'Hora recepcion', :type=>:short_date)
      @grid.add_column('total_nota',     :type=>:currency)
      @grid.add_column('terminal',       :type=>:number)
      @grid.add_column('movil',          :type=>:phuno)
      @grid.add_column('mensaje_respuesta')
      @grid.add_column('id_tx',          :header=>'Detalle Nota', :type=>:link_to,
                                         :options=>{:label=>'ver', :action=>:uno})
      @grid.fill_from_database(HeaderNotaVenta, :limit=>50, :order=>'hora_recep_bo desc')
   end

     	

La Vista:

   	<%= render_grid @grid %>
	

Este ejemplo muestra como formatear las columnas. La última columna es un link de imagen a otra acción. Se van a mostrar sólo los primeros 50 registros, de forma ordenada.

 
 

Trés

El Controlador:

   def trés
        @grid = Grillo.new( :title=>'Ranking de llamadas: internas->externas (desde hace 2 dias)' )
        @grid.add_column("clid",                :header=>'El que llamo')
        @grid.add_column("veces",               :type=>:number, :sql_select=>" lpad(count(*),2,'0') ")
        @grid.fill_from_database(Cdr,
                :conditions=>"clid!='' AND disposition='ANSWERED' AND clid like '%<%' AND calldate>'#{2.days.ago}' ",
                :group=>'clid',
                :order=>'veces desc',
                :limit=>30
        )
   end


     	

La Vista:

   	<%= render_grid @grid %>
	

Aqui, se puede ver como trabajar con querys 'especiales', se utiliza un agrupamiento. La columna 'veces' se va a procesar desde la base de datos de la siguiente forma "SELECT clid, lpad(count(*),2,'0') AS veces FROM ...." . También se setea el título del grillo.

 
 

Cuatro

El Controlador:

   def cuatro
        @grid = Grillo.new :title=>'Productos'
        @grid.add_column("productos.codigo",            :header=>'Codigo', :type=>:number)
        @grid.add_column("productos.descripcion",       :header=>'Descripcion', :type=>:string)
        @grid.add_column("peso_kg",                     :header=>'Peso', :type=>:number, :sql_select=>" ltrim(peso_kg,'0') ")
        @grid.add_column("familias.descripcion",        :header=>'Familia', :type =>:string)
        @grid.add_column("productos.familia_id",        :header=>'Ver familia', :type =>:image_link_to,
                                                                                :options=>{:image=>'next.png'})
        @grid.fill_from_database(Producto, :joins=>"INNER JOIN familias ON familias.id=productos.familia_id", :limit=>50)
   end


  	

La Vista:

   	<%= render_grid @grid %>
	

Aquí puedes ver como utilizar JOINs en la extracción de datos desde la base de datos.

 
 

Cinco

El Controlador:

   def cinco
        @grid  = Grillo.new(
                :pages=>pages_options(:pages_label=>'P\xc3\xa1gina %s de %s'),
                :search=>search_options,
                :order=>order_options,
                :title=>"Registro de Llamadas"
        )
        @grid .add_column("calldate",       :header=>'Fecha', :type=>:short_date, :orderable=>true)
        @grid .add_column("clid",               :header=>'Origen', :type=>:phuno, :searchable=>true, :orderable=>true)
        @grid .add_column("dst",                :header=>'Destino', :type=>:phuno, :searchable=>true)
        @grid .add_column("duration",           :header=>'Duración', :searchable=>true,
                                                :format=>'%s [min]', :type=>:number, :sql_select=>" duration/60 ")
        @grid .add_column("dstchannel", :header=>'Canal')
        @grid .add_column("disposition",        :header=>'Estado', :searchable=>true)
        @grid .add_column("lastapp",    :header=>'Comando')
        @grid.fill_from_database(Cdr, :conditions=>"src!='' and duration>'25'")
   end

  	

La Vista:

   	<%= render_grid @grid %>
	

Este es un ejemplo de una de las cosas más entretenidas del grillo. Habilitación de ordeamiento por columnas, búsqueda y paginación. El resultado del ejemplo es el siguiente:

 
 

Seis

El Controlador:

   def seis
        @grid = Grillo.new( :title=>'Datos de un rectangulo' )
        @grid.add_column("lado1",       :sql_select => ' CAST( RANDOM()*10 as INT) ',
                                        :type => :number, :format=>' %s cm' )
        @grid.add_column("lado2",       :sql_select => ' CAST( RANDOM()*10 as INT)  ',
                                        :type => :number, :format=>' %s cm' )
        @grid.add_column("perimetro",   :value => " (:lado1: + :lado2:) *2 ",
                                        :type => :number, :format=>' %s cm' )
        @grid.add_column("area",        :value => " :lado1: * :lado2:",
                                        :type => :number, :format=>' %s cm2')
        @grid.fill_from_database(Producto, :limit=>100)
   end


  	

La Vista:

   	<%= render_grid @grid %>
	

Muestra la capadidad de definir una columna como la operacion de otras. Perímetro=2*(lado1+lado2). Área =lado1*lado2. Es el intérprete Ruby el que ejecuta la operacón.