lunes, 7 de febrero de 2011

GRAILS - Establecer la ordenación de las asociaciones

Después de unos días de ausencia... os traigo un truquito nuevo que he leído en el Observatorio de grails, concretamente en este post.

No sé si os habréis encontrado alguna vez con la necesidad de obtener las relaciones de un objeto ordenadas siempre de la misma manera, pero yo sí. Hasta ahora lo que hacía era, si necesitaba que estuvieran ordenadas por id, añadía una propiedad List con el nombre de la relación. También he utilizado SortedSet para obtener una ordenación personalizada de esa relación. Y, por supuesto, definir el orden cada vez que hacía una consula, es decir, .findAllByNombre(nombre,[sort:'nombre',order:'asc']).

Coincidiréis conmigo que la última forma es bastante... mala, o repetitiva. Puede venir bien para casos concretos en que necesitas ordenar por otros campos, por ejemplo, pero para mantener siempre el mismo tipo de ordenación. resulta un poco pesado y muy propenso a errores, bien porque se te olvide hacerlo en alguna de las consultas, bien porque te equivoques de parámetro.

En cuanto a List y SortedSet, creo que son buenas opciones, aunque he de decir que con List he tenido algunos problemas, ya que te obliga a hacer los guardados de una forma determinada. (Podéis leer sobre List, SortedSet y Map en la documentación de grails)

Bueno, y al fin el nuevo truquito (para mí al menos) para realizar la ordenación de las relaciones. Supongamos que tenemos la siguiente clase de dominio:

class Empresa{
   String nombre
   ...

   static hasMany = [direcciones:Direccion]
}

Si quisiéramos que por defecto la ordenación sea por el código postal de la dirección, únicamente tenemos que hacer un pequeño cambio en la clase de dominio de empresa:

class Empresa{
   String nombre
   ...

   static hasMany = [direcciones:Direccion]

   static mapping = {
      direcciones sort:'codigoPostal',order:'asc'
   }
}

A partir de ahora, cada vez que obtengamos las direcciones de una empresa, éstas vendrán ordenadas por el código postal.

Enjoy!

0 comentarios:

Publicar un comentario

Twitter Delicious Facebook Digg Stumbleupon Favorites More