Secciones

Artículos para tus primeros pasos

Si estás empezando a introducirte en el mundo de Groovy y Grails, no te pierdas nuestros artículos básicos: 

Entrevistas con los expertos
 

Los protagonistas te cuentan de qué van los proyectos más importantes del mundo Groovy:


Un proyecto de:
ImaginaWorks
Campus Escuela de Groovy

Empezando con Grails, parte 2

miércoles 16/05/2007

En esta segunda parte de nuestra introducción a Grails, vamos a tratar cuestiones relacionadas con el modelo de datos y las relaciones. Para ello vamos a construir un pequeño site que permita a los usuarios compartir trucos y fragmentos de código Groovy, al estilo Java Almanac.

Empezamos por definir nuestro modelo: el site tratará con trucos publicados por los usuarios. También será posible publicar comentarios a un truco, así como valorar su calidad para controlar la utilidad de la información. Si un truco es denunciado por otro usuario, se retirará provisionalmente y se avisará a su autor para que lo revise. Así que una primera aproximación podría ser esta:

Usuario
    nombre:Texto
    fecha:Fecha
    email:Texto
    perfil:Texto
Truco
    autor:Usuario
    comentarios:Lista
    denunciado:Boolean
    texto:Texto
    titulo:Texto
    fecha:Fecha

Comentario
    autor:Texto
    texto:Texto
    fecha:Fecha

Para empezar, como ya hemos hecho antes, seleccionamos la carpeta donde vamos a trabajar y ejecutamos el comando
$ grails create-app GroovyAlmanac

Entramos en el directorio GroovyAlmanac, y creamos nuestras clases del dominio:

$grails create-domain-class usuario
$grails create-domain-class truco
$grails create-domain-class comentario

Una vez creados los archivos, los editamos para completar las entidades:

grails-app/domain/Usuario.groovy:

class Usuario {
    static hasMany = [trucos:Truco]
    String nombre
    String email
    Date fechaAlta
    String email
}

grails-app/domain/Comentario.groovy:

class Comentario {
    static belongsTo = Truco
    String autor
    String texto
    Date fecha
}   

grails-app/domain/Truco.groovy:

class Truco {
    static hasMany = [comentarios:Comentario]
    static belongsTo = Usuario

    List comentarios
    Date fecha
    String titulo
    String texto
    boolean denunciado
}   

Aparte de que como vimos en la entrega anterior no necesitamos definir getters ni setters, estas entidades tienen otra particularidad: Comentario define una variable estática "belongsTo" que inidica la parte "N" de una relación 1:N entre Truco y Comentario, mientras que esta última define una propiedad estática de nombre "hasMany" que representa el lado "1" (un Map, con cadenas de texto como claves y clases como valores). Con ellas estamos indicando a grails debe mapear esta relación a la base de datos. Como véis hemos definido la propiedad comentarios explícitamente, mientras que en Comentario no hay ninguna propiedad truco. En realidad podríamos haber omitido comentarios, pero entonces grails usaría la colección por defecto, que es Set, y queremos que los comentarios guarden el orden en que son añadidos a la colección.

Igualmente, hay una relación 1:N entre los trucos y los usuarios (un usuario puede publicar varios trucos, cada truco pertenece a un usuario).

Además, hemos definido otra propiedad estática en la clase Truco: optionals. Por defecto todas las propiedades en una entidad son obligatorias, y grails realiza una validación automática en el momento de guardar el objeto en base de datos, y lanzará una excepción si alguna de las propiedades es null excepto si está en la lista "optionals". Para controlar la validación de las propiedades podemos definir restricciones mediante la palabra reservada constraints:

class Usuario {
    static hasMany = [trucos:Truco]
    String nombre
    Date fechaAlta
    String email

    static constraints = {
        nombre(size:3..50)
        email(email:true)       
    }
}

class Comentario {
    static belongsTo = Truco
    String autor
    String texto
    Date fecha

    static constraints = {
        autor(size:3..50)
        texto(maxSize:999999)         
    }
}

class Truco {
    static hasMany = [comentarios:Comentario]
    static belongsTo = Usuario

    List comentarios
    Date fecha
    String titulo
    String texto
    boolean denunciado

    static constraints = {
        titulo(size:10..1000)
        texto(maxSize:999999)        
    }   
}   

Probablemente no hace falta explicar mucho lo que significa cada restricción, es lo bueno de Grails: el codigo lo dice casi todo. En las propiedades de tipo texto estamos restringiendo las longitudes mínima y máxima, y en la propiedad que representa un email utilizamos una restricción incorporada que valida que la cadena de texto cumpla con las restricciones de una dirección de correo electrónico.

Pues nada, ya solo falta pedir a Grails que genere el controlador y las vistas necesarias para realizar operaciones CRUD con estas entidades:

$ grails generate-all comentario
$ grails generate-all truco
$ grails generate-all usuario

Antes de ejecutar la aplicación, hay un último tema que quería tratar en esta entrega: la configuración del acceso a datos. Hasta ahora hemos estado trabajando sin pensar en base de datos, porque como ya vimos, Grails incorpora HSQLDB para empezar a trabajar sin tener que contar con un servidor. Sin embargo, en la mayoría de los casos tendremos una base de datos y querremos usarla. Para ello editamos el archivo grails-app/conf/DevelopmentDataSource.groovy . Como véis, Grails permite tener hasta tres entornos distintos (desarrollo, pruebas y producción) configurados, de forma que:

$ grails war - genera un war de mi aplicación configurada para el entorno de desarrollo.
$ grails prod war - genera el war configurado para producción.

Pues bien, el archivo DevelopmentDataSource.groovy tiene esta pinta:

class DevelopmentDataSource {
   boolean pooling = true
   String dbCreate = "create-drop" // one of 'create', 'create-drop','update'
   String url = "jdbc:hsqldb:mem:devDB"
   String driverClassName = "org.hsqldb.jdbcDriver"
   String username = "sa"
   String password = ""
}

Habrá que modificar la url, el controlador y las credenciales. Una última cosa respecto a esto: tened en cuenta que el Jar con el controlador tendrá que ir en el directorio lib de nuestra aplicación.

Y finalmente ejecutamos:

$ grails run-app

para ejecutar la aplicación y comprobar que todo funciona correctamente.

Y bien, nada más por ahora. En la próxima entrega seguiremos con esta aplicación, añadiendo algo de lógica de negocio y explorando las posibilidades que nos brinda Grails.
   
Más información: http://groovy.org.es

Contenidos relacionados:



1 comentarios:

Empezando con Grails, parte 2

willy - viernes 28/12/2007

Excelente, no habia podido comprender mas rapido, estaba leyendo el libro, pero es un poco mas rigoroso. Muchas gracias asta pronto.

Tienes que estar registrado para iniciar sesión y poder publicar tus comentarios