Friday 27 April 2007

AOP en Rails???? Marchando!!!!!!!

Observers. Si conoces como funciona AOP te vas a maravillar con lo sencillo que va a ser añadir control de aspectos a nuestras clases Model en Rails. De echo, si lo pensamos un momento es el punto más obvio del modelo Rails en el que añadir esta funcionalidad. Nos va a permitir añadir control a los puntos de entrada y salida de las operaciones CRUD que nos proporciona ActiveRecord::Base, es decir, new, create, update, delete, save.

Lo que nos propone ActiveRecord::Observer es el poder crear metodos que se ejecuten antes o después de las invocaciones a cada uno de estos métodos. La forma es muy sencilla. Estos son los pasos para hacer un log para cada operación de guardado. Haremos un pre-log y un post-log.

  1. Creamos una clase que herede de ActiveRecord::Observer y la nombraremos con el nombre del Modelo a observar seguido de Observer, es decir, si nuestro modelo es Shop la llamamos ShopObserver.
  2. Guardamos el archivo en la carpeta app\model con el nombre shop_observer.rb
  3. definimos un método before_save en el que ponemos la funcionalidad a ejecutar ANTES de guardar. En nuestro caso, el log.
  4. definimos un método after_save donde incluimos funcionalidad para DESPUES de guardar.
  5. Editamos el archivo config/environment.rb modificando la entrada config.active_record.observers = :shop_observer
El codigo fuente final

class ShopObserver < ActiveRecord::Observer def before_save(a_shop) a_shop.logger.info("PRE-LOG - Shop name = #{a_shop.name}") end def after_save(a_shop) a_shop.logger.info("POST-LOG - Shop name = #{a_shop.name}") end end Y ya esta todo. Ahora podemos ejecutar la consola del entorno con ruby script/console para testear lo que hemos creado. Si ejecutamos
shop = Shop.new(:name=>"ebay")
shop.save

vamos a ver que el archivo development.log va a contener dos entradas de log ejecutadas antes y después de llamar al método save.

Yo estoy cada vez más encantado con la funcionalidad que me proporciona este framework DE SERIE, y sin necesidad de añadirle plugins o librerías externas.


Thursday 26 April 2007

Active Records (II)

Siguiendo con el manualillo que voy escribiendo sobre como entender el concepto de ActiveRecord, voy a poner una ayuda para entender mejor como se realizan relaciones. Las relaciones se establecen usando palabras clave y un punto de relación. El problema es con los puntos de relación. Según el tipo de relación tenemos que definirlo como plural o como singular. Alguien me djo una vez que lo que mas le gustaba de Ruby era el lenguaje en si, ya que se parece mucho al lenguaje natural. Estas son las formas de relacion posible.

  • Relaciones singulares
    • has_one :other
    • belongs_to :other
  • Relaciones plurales
    • has_many :others
    • has_and_belongs_to :others
Mejor todavía, vamos a verlas desde el punto de vista de un modelo entidad relacion.

  • One-to-One
    • has_one :other (TABLA REFERENCIADA)
    • belongs_to :other (TABLA CON LA FOREIGN KEY)
  • One-to-Many
    • has_many :others (TABLA REFERENCIADA)
    • belongs_to :other (TABLA CON LA FOREIGN KEY)
  • Many-to-Many (Join table)
    • has_and_belongs_to :others (AMBAS TABLAS REFERENCIADAS)
Siguiendo la guia que di en el anterior articulo podemos entender mejor las referencias que hacen las palabras reservadas. Solo queda un detalle más a esclarecer. el uso de singulares y plurales.

Nuestras tablas estan en plural, nuestras clases Model estan en singular (customers, Customer) y aqui, ¿Como la ponemos? pues depende. Nos tenemos que olvidar de la convención de nombrado de la BBDD y el Modelo y pensar como lo hariamos si tuvieramos que describirlo.

Ej.

En una relacion 1 a N entre unas tablas Writers - Novels la relación sería

class Writer
has_many :novels
end

class Novel
belongs_to :writer
end

Es un poco extraño ya que no tenemos una identificación directa para novels en las clases Model pero, ¿No os parece intuitivo? Este ejemplo es demasiado obvio, en otras ocasiones los elementos que almacenamos en las BBDD no son tan sencillos de identificar por sus referencias, pero creo que es suficientemente explicativo.

Tuesday 24 April 2007

Active Records

Siguiendo con el tema de moda (de momento único, lo se..... paciencia) me apetece hablar un poco del Modelo, implementado por Active Record, y más concretamente de las relaciones entre tablas. Bajo mi punto de vista, la situación mas normal que nos vamos a encontrar es una en la cual la BBDD nos sea impuesta y necesitemos modelar el diagrama Entidad-Relación de esta a través de clases Model (clases que heredan de ActiveRecord).

A parte de crearnos los modelos de las tablas con los scripts, es necesario que los relacionemos para crear un modelo lógico de nuestra BBDD. Aquí es donde empiezan los problemas, pq si bien es sencillo crear las relaciones, no es demasiado intituitivo a causa de las palabras reservadas que se utilizan. Voy a poner una serie de trucos que son interesantes para entender correctamente el modo de realizar esta relacion.

  • foreign keys= cuando definamos en la tabla los campos que van a actuar como foreign key tenemos que hacerlo con la formula modelo_id. Ejemplo: Tabla = customers Modelo = Customer Foreign key en otra tabla = customer_id
  • belongs_to = es muy poco intutitivo . Se pone en la clase Model que representa a la tabla que tiene la Foreign key. Mi recomendación -> entiendelo como referencia_a.
  • has_many / has_one = La pondremos en la tabla relacionada por una Foreign key. Se entiende mejor si la interpretamos por es_referenciada_por.
Volvere a este tema más adelante ya que tiene mucha miga.

Thursday 19 April 2007

Ruby In Steel

Después de muchos quebraderos de cabeza para conseguir debugear en RoR, me he decantado por la opción de Ruby In Steel Personal Edition. Este plugin para Visual Studio 2005, en su versión gratuita, incluye toda la funcionalidad necesaria para desarrollar RoR. Es cierto que faltan algunas cosas importantes como el CodeInsight pero hasta que Aptana saque una release de RadRails que permita debugear a una velocidad aceptable, voy a seguir con este IDE. Además, esta basado en Visual Studio 2005, que también ayuda.

De todos modos, espero con impaciencia la siguiente release de RadRails. Les falta poco. Cosas que tendrían que mejorar (y me consta que estan trabajando en ello a raiz de lecturas en los foros)

  • Debug. Es catastrofico. Tarda unos 5 minutos en lanzar WEBrick que se carga en 5 seg en la consola de sistema.
  • Tests. Cuesta también demasiado. El script de ruby en la consola de comandos tarda del orden de 14 seg, y en el IDE unos 3 minutos. Eso si, la integración con Eclipse es genial.
  • Code Insight. O la-ventana-de-ayuda-que-sale-con-Ctrl-Espacio. Funciona en las Nightly Build, pero faltan algunos métodos y tiene algunos bugs.
Actualizado.

Enlace al plugin para Visual Studio.

http://www.sapphiresteel.com/Steel-Download-and-Change-Log

Wednesday 18 April 2007

Debug con RadRails

Rails es genial...............hasta que entras en la fase de Debug. Llevo todo el día probando diferentes opciones para realizarlo. Hasta ahora, había usado RadRails como IDE y más o menos era suficiente. Pero hasta que no saquen la versión nueva ahora que se han integrado con Aptana el debug por defecto no funciona. He encontrado varias soluciones que voy a contar.

  • Configurar script/server como punto de Debug. Funciona, pero le cuesta un mundo arrancar el servidor (y digo un mundo por no decir una burrada).
  • Descargarte una night build de RadRails como plugin para Eclipse usando RDT. Funciona mucho mejor, más rápido y siempre engancha al llegar a los puntos de interrupción. Me ha parecido demasiado Buggy. Aún tienen que mejorar bastante.
  • Usar Ruby in Steel Personal Edition. Es un plugin para el Visual Studio 2005 que añade soporte Ruby y RoR. Es una version gratuita del mismo Software versión Developer y funciona bastante bien......salvo pq no me deja editar ficheros (estoy actualizando ahora mismo el Visual Studio con el SP1 para solucionar esto)
Creo que actualmente esta última será la mejor, por velocidad y pq esta basada en el VS2005. Si con el SP1 no me funciona voy a instalarme la versión en Inglés, pq estoy casi seguro que el problema viene por incompatibilidades de los editores por los paquetes de idioma instalados.

Bueno, no voy a desanimarme por esto!!!! Sigo opinando que Rails es muy interesante y las herramientas seguro que van a evolucionar a lo largo de los próximos meses que se prometen apasionantes.

Friday 13 April 2007

Hello World

Bueno, un blog dedicado a la programación, a la tecnología, a la movilidad y a internet no podía empezar de otra forma que con un Hola Mundo no?????.

He estado pensando mucho el lenguaje a usar, y al final va a ser.........castellano. Entre tanto, ahí lo dejo también en Ruby, mi último lenguaje en aprender (todo por el Rails).


puts "Hello World"


Me he quedado ancho...........