viernes, enero 26, 2007

Pluralizando

Una de las cosas más excitantes de Rails son los generadores. Son scripts Ruby que generan (¡oh sorpresa!) código Ruby con diferentes fines. Existen varios tipos de generador: controller, migration, model, view, etc. Cada uno crea varios scripts y directorios con las funciones mínimas del tipo escogido y con las referencias a los módulos necesarios.

Así, tenemos que al usar el generador de modelos, le pasamos un parámetro que es el nombre y genera una clase, un conjunto de pruebas y la correspondiente migración para crear la tabla en la base de datos.

Para generar todos estos archivos, se usan plantillas y además algunas funciones del framework para nombrar clases y archivos. Recordemos que Rails tiene un principio

Convention over Configuration


Esto significa que se prefiere usar estándares para los nombres de clases, tablas, objetos, referencias y demás items en lugar de estar generando mega-archivos de configuración (web.config o web.xml por ejemplo). Por ejemplo, al usar

./script/generate model account

se crea un modelo Account que se compone de los siguientes archivos y directorios:

Modelo: app/models/account.rb
class Account <>

Prueba: test/unit/account_test.rb
require File.dirname(__FILE__) + '/../test_helper'

class AccountTest <>

Fixture: test/fixture/accounts.yml

Migración: db/migrate/XXX_add_accounts.rb
class CreateAccounts <>

Si observamos un poco el código generado se verá que a partir del nombre del modelo "account" se han derivado varias etiquetas para cada uno de los items:





Mi modeloaccount
Nombre de claseAccount
Clase de pruebaAccountTest
Tabla en la BDaccounts

Se puede ver que el nombre de modelo se le aplica el estilo Pascal (CamelCase) para obtener el nombre de la clase y que se hace en plural para el nombre de la tabla en la base de datos. Y esto aplica incluso en sustantivos irregulares, por ejemplo:





Mi modeloperson
Nombre de clasePerson
Clase de pruebaPersonTest
Tabla en la BDpeople

"Person" => singular, "People" => plural. Brillante ¿no?

Pero..... todo se maneja en inglés :( Yo no spiko spaniol.

Como siempre el gran dios google tiene varias respuestas. La primera la encontré en HackerDude que nos habla de algo llamado "Inflector" (¿alguien cursó latín o alemán?) y encontré todavía más detalle en BlogOnRails. De inicio es algo harto sencillo: expresiones regulares. Se tienen que agregar o sustituir varias expresiones regulares para que Rails sepa como hacer plurales o singulares, algo como esto:

Inflector.inflections do |inflect|
inflect.plural /$/, ‘es’
inflect.plural /s$/, ’s’
inflect.plural /z$/i, ‘ces’
inflect.plural /([aeiou])$/i, ‘\1s’
inflect.plural /_(.*)$/, ’s_\1′
inflect.singular /s$/i, ‘’
inflect.singular /ces$/i, ‘z’
inflect.singular /(.*)s_(.*)/i, ‘\1_\2′
inflect.irregular ‘user’, ‘users’
inflect.irregular ‘estado_civil’, ‘estados_civiles’
inflect.uncountable %w( pantalones )
end


Y ¡listo!. A probar con:





Mi modeloorganizador
Nombre de claseOrganizador
Clase de pruebaOrganizadorTest
Tabla en la BDorganizadores

Este esquema no es perfecto, pero es pragmático ;)

En otro orden de ideas, ya está agendada la siguiente reunión de la Comunidad .NET de la Cd. de México, la orden del día es la siguiente:

Utilizando Delegados (Segunda Parte) - Octavio Telis
Estilos y Control Templates en WPF - Raúl Guerrero
Source Control en Team Foundation Server - Juan Karam
Por Confirmar Tema - Héctor Obregón

El lugar y la hora:
Fecha: Martes 30 de Enero
Horario: 7:00 a 9:50 p.m.
Lugar: Intersoftware Training
World Trade Center - Piso 35
Mexico D.F.

Y todavía pa'que se animen, habrá rifa de libros entre los asistentes. ¡Qué esperan! Nos vemos el próximo martes.

Finito.

2 comentarios:

knocte dijo...

La notación pascal no es la misma que la del camello:

EstoEsPascal
estoEsCamello

Un saludo.

ChilliCoder dijo...

¡Ooopss!
Tienes toda la razón.... pero with a little help from your friends...