21 enero, 2009

ActiveRecord.js

Ryan Johnson de Aptana publicó hace unos días un artículo sobre la beta de ActiveRecord.js, que es un mapeador de objetos relacionales (ORM) de fuente abierta que soporta múltiples entornos JavaScript:

  • Google Gears (persistencia en el lado del cliente)
  • En la memoria (si no hay servidor SQL en el cliente)
  • Adobe AIR (persistencia en el lado del cliente)
  • SQLite y MySQL (via Aptana Jaxer)
  • entornos adicionales (como HTML5) que se espera que aparezcan funcionando con la comunidad en el proyecto

ActiveRecord.js abstrae los comandos SQL subyacentes de forma que los desarrolladores JavaScript puedan tener una API unificada para almacenar, encontrar, seleccionar y recuperar objetos y sus datos usando el patrón ActiveRecord popularizado por la comunidad de Ruby on Rails.

Donde otros proyectos han buscado portar la implementación directa de ActiveRecord con JavaScript, el enfoque aquí es diferente. Los aficionados existentes a ActiveRecord, acostumbrados al vocabulario ultraconciso de la implementación de Rails encontrarán en su lugar algo bien adaptado a los desarrolladores Javascript, adaptando los patrones refinados por la comunidad Rails (y algunas influencias de Django) en APIs potentes y fáciles de usar.
// define usuario
var User = ActiveRecord.define('users',{
    username: '',
    email: ''
});

// indica la relación con artículos
User.hasMany('articles');

// crea un usuario
var ryan = User.create({
    username: 'ryan',
    email: 'rjohnson@aptana.com'
});

// define artículo
var Article = ActiveRecord.define('articles',{
    name: '',
    body: '',
    user_id: 0
});
// indica la relación inversa
Article.belongsTo('user');

// crea un articulo relacionado con el usuario creado
var a = Article.create({
    name: 'Announcing ActiveRecord.js',
    user_id: ryan.id
});
// modifica el nombre del artículo
a.set('name','Announcing ActiveRecord.js!!!');
a.save();

// obtiene el usuario del artículo
a.getUser() == ryan;
// obtiene la lista de artículos del usuario
ryan.getArticleList()[0] == a; 
La librería viene en un sólo archivo sin dependencias externas y se ejecuta en el cliente en todos los navegadores con o sin acceso a bases de datos SQL y puede ser usado en el servidor con MySQL o SQLite via Aptana Jaxer, el servidor abierto orientado a Ajax que permite usar Javascript en el servidor. Las características de esta beta incluyen validaciones de datos, creación de esquemas / migraciones y relaciones entre modelos. Como beta es bastante estable, pero sus autores esperan un uso más extendido y las aportaciones de los usuarios para llamarla 1.0. También están trabajando con gente de Google, Mozilla, y Adobe para conseguir soporte para entornos Javascript en el navegador, en dispositivos móviles, en el escritorio y en el servidor.

Puesto que uno de los usos de esta librería es soportar aplicaciones de cliente con estados (usando HTML, HTML5, Gears, Adobe AIR, etc.) tienen características que las librerías para el servidor (Jaxer) no necesitan soportar. Una de les características más vistosas es la sincronización de datos. Usando la implementación actual, se pueden encontrar registros o conjuntos enteros de resultados y conseguir que esos objetos reciban actualizaciones automáticas si los datos que contienen son modificados por otras consultas, o si registros contenidos en el conjunto de resultados son destruidos o creados. Esto es de gran utilidad cuando se construyen interfícies de usuario que dependen de datos actualizados. Aunque la sincronización entre cliente y servidor no está soportada todavía, se contemplará en el futuro.

ActiveRecord.js es parte de ActiveJS, una robusta librería MVC creada explícitamente para aplicaciones Ajax y Javascript (y que funciona con otras librerías Ajax).

Para disfrutar de la simplicidad de ActiveRecord.js:

Algunas notas:
  • No todos los tests unitarios funcionan con IE ahora mismo
  • Pronto se implementará un hack de persistencia para IE (cookies / form / etc)
  • Las relaciones Muchos a Muchos aún han de ser implementadas
  • Todas las validaciones incorporadas con Rails serán portadas (al igual que ActsAsList y ActsAsTree)

La sincronización de datos entre el cliente y el servidor aún es una cuestión abierta. En el equipo están intentando que se cambie la especificación de HTML 5 para que soporte consultas SQL síncronas desde Web Workers (hilos Javascript) asíncronos, y no soportarán consultas SQL asíncronas a menos que se ratifique ese cambio. También incluye soporte experimental de la especificación SQL de HTML 5 tal y como la implementa Safari, aunque resulta muy difícil de utilizar.

Publicar un comentario en la entrada

Últimos links en indiza.com