20

Introducción a Rails con MongoDB: lectura técnica

138Puntos

hace 4 años

MongoDB es un sistema de base de datos ampliamente aceptado por la industria, desde su documentación es mencionado que MongoDB es una base de datos basada en documentos, es de propósito general, distribuida y construida para aplicaciones modernas.

MongoDB Inc es la compañía detrás de este sistema de base de datos y sus herramientas y plataformas complementarias, MongoDB Inc tiene un esquema de productos basado en licencias de código abierto y licencias privadas, y para efectos de este post, usaremos la versión MongoDB Community Server que está liberada como versión de código abierto cuyo código y licencia puedes ver en su repositorio de github.

Gracias a la amplia comunidad y aceptación de Rails en el mundo de desarrollo, Rails tiene un vasto número de controladores con diversos sistemas de base datos, incluyendo MongoDB. Algunos de estos controladores pueden ser considerados como mapeadores de objetos al mundo de las estructuras dentro de las bases de datos.

Comúnmente los controladores de base datos tradicionales (bases de datos relacionales) para el desarrollo de sistemas de información usando programación dirigida a objetos y especialmente web, son nombrados ORM (Object-Relational Mapping). Para Rails el ORM por defecto es ActiveRecord el cual, habilitando compresión conceptual, libera la carga del aprendizaje de SQL como lenguaje específico de dominio para pasar a una interfaz de consulta más moderna soportada sobre Ruby, dando como resultado final un lenguaje más expresivo y fácil de entender que permite hacer consultas y escribir los registros de la base de datos con facilidad.

Para el caso de MongoDB y Rails, en el 2009 Durran Jordan comenzó una ardua tarea soportando y desarrollando Mongoid, lo que actualmente es el controlador más usado por la comunidad de Rails convirtiéndose en el controlador de tipo ODM oficial de MongoDB.

Un ODM (Object Document Mapper) es la contraparte del ORM para las bases de datos basadas en documentos, al igual que ActiveRecord, Mongoid también habilita compresión conceptual y propone un lenguaje simple para realizar consultas y escritura de registros.

Empezando a desarrollar

Instalación de MongoDB

No es intención de este blogpost mencionar una instalación detallada, por lo que tampoco será necesario hacer una configuración diferente a la configuración por defecto del servidor de base de datos después de haber sido instalado, sin embargo, la documentación oficial brinda diversos esquemas de instalación según sea el sistema operativo, a continuación son descritos algunos enlaces de interés:

Por otro lado, para configuraciones más avanzadas, es posible tener la necesidad de instalar varias versiones de MongoDB en el mismo entorno local, una de las alternativas para solucionar este es escenario es usar un sistema de gestión de versiones como mongodb-version-manager

Creando el esqueleto de la aplicación

presunciones este post asume que Ruby 2.7, Rails 6, nodejs y Yarn están instalados, y que tenemos un ambiente de tipo Linux basado en una consola de comandos compatible con bash

En la raíz de nuestro repositorio de proyecto, digitamos el siguiente comando

rails newexample -O -T

La opción -O es usada para evitar instalar ActiveRecord como ORM en nuestro proyecto, y la opción -T es para evitar usar el sistema de pruebas automatizadas por defecto de Rails (esta opción no es necesaria y sólo colocamos esta opción para evitar tener mucho ruido visual en el proyecto y sus generadores respecto del módulo Test::Unit)

Una vez creada la aplicación example, añadiremos la gema al Gemfile, un buen lugar es justo abajo la gema de rails.

gem'mongoid', '~> 7.1.0'

Después de haber añadido la gema, ejecutaremos el comando de instalación de librerías del bundler en la consola de comandos

bundle install

crearemos el archivo de configuración de Mongoid que permitirá el acceso a la base de datos, este comando creará el archivo mongoid.yml dentro del directorio config

rails g mongoid:config

El archivo de configuración creado tiene la siguiente taxonomía simplificada:

development:# Configure available database clients. (required)  clients:# Defines the default client. (required)    default:      database: example_development
      hosts:        - localhost:27017

Para una configuración simple y por defecto, sólo es necesario establecer un cliente llamado default y dentro de este configurar el nombre de la base de datos y su dirección y puerto de conexión que por defecto son localhost y 27017 respectivamente.

Basados en la configuración anterior, es importante mencionar que en desarrollo y como parte de un ambiente de experimentación no es necesario previamente crear credenciales de acceso ni tampoco una base de datos. Dado que desde la configuración del archivo se puede crear la base de datos si esta no existe.

Por otro lado, es importante mencionar, que el archivo mongoid.yml debería ser ignorado de git, a menos que se use una estrategia diferente para garantizar que datos sensibles tanto en desarrollo como en otros ambientes no sean distribuidos.

Antes de empezar a crear modelos y estructuras de datos es importante mencionar una equivalencia entre el mundo de base de datos relacionales tradicionales y el de MongoDB, la imagen abajo presenta dicha correlación de terminología:

BD relacional.png

Una vez configurado la conexión de base de datos con Mongoid y previo a verificación que el servidor de MongoDB esté corriendo, podemos empezar a crear un par de modelos con el generador scaffold de Rails. Vamos a crear una estructura de dos modelos Dog y Breed (Perro y Raza), ambos tendrán un campo llamado nombre y el modelo Breed tendrá una relación de uno a muchos con el Modelo Dog. De esta forma. En una consola de comando digitamos:

rails g scaffold Breed name:string
rails g scaffold Dog name:string

Habiendo ejecutado estos comandos tendremos al final entre otros archivos, los siguientes:

# app/models/dog.rbclassDogincludeMongoid::DocumentincludeMongoid::Timestamps
  field :name, type: String
end# app/models/breed.rbclassBreedincludeMongoid::DocumentincludeMongoid::Timestamps
  field :name, type: String
end

include Mongoid::Document es el encargado de convertir la clase de Ruby al mundo de los modelos y habilitar la conexión directa con la base de datos, por otra parte include Mongoid::Timestamps, añade los campos created_at y updated_at de tipo DateTime que almacenan de forma automática la fecha de creación y actualización del documento o registro una vez manipulado.

Finalmente, es importante aclarar que cada documento creado responde a un campo de identificación único en formato hexadecimal que no guarda una secuencia natural al ser humano. Pero está compuesto de un contador y la estampa de tiempo actual de la aplicación. Este campo es conocido como BSON::ObjectId.

Antes de empezar con los procesos de experimentación con el sistema de consultas, añadiremos la relación de uno a muchos entre Breed y Dog, terminando con los modelos de la siguiente forma:

# app/models/dog.rbclassDogincludeMongoid::DocumentincludeMongoid::Timestamps
  field :name, type: String

  belongs_to :breedend# app/models/breed.rbclassBreedincludeMongoid::DocumentincludeMongoid::Timestamps
  field :name, type: String

  has_many :dogsend

De esta forma, ya podemos empezar a gestionar documentos y consultas a través de la consola de rails, nótese que al contrario de ActiveRecord no debemos crear un schema o migraciones, los cambios en la estructura de datos o relaciones se reflejan directamente desde la descripción del modelo.

rails console
> bulldog = Breed.create name: ‘Bulldog’ # crea un documento Breed de nombre ‘bulldog’
> poodle = Breed.create name: ‘Poodle’ # crea un documento Breed de nombre ‘poodle’
> Dog.create name: ‘Guardian’, breed: bulldog # crea un documento Dog con la asociación a Breed
> Dog.create name: ‘Lulú’, breed: poodle # crea un documento Dog con la asociación a Breed

De esta manera hemos creado cuatro documentos que son visibles desde la interfaz gráfica ingresando a localhost:3000/dogs y localhost:3000/breeds, para correr el servidor de Rails e ingresar a estas URLs es importante recordar efectuar la instalación de webpacker y yarn en la consola de comandos

rails webpacker:install
rails server
Breed.JPG

Para efectuar consultas simples, podemos usar una interfaz de comandos muy similar a la de ActiveRecord en la consola de Rails

rails console
> Dog.all # para devolver la consulta de todos los registros disponibles
> Dog.all.to_a # para transformar la consulta en un arreglo de documentos
> Dog.count # para obtener el número de documentos de tipo Dog
> bulldog = Breed.find_by(name: ‘Bulldog’) # para buscar y obtener la raza ‘bulldog’
> Dog.where(breed: bulldog) # para buscar todos los Dogs de raza ‘bulldog’
> Dog.where(breed: bulldog).count # para obtener el número de Dogs de raza ‘bulldog’

De esta forma, concluimos con la introducción la integración de Rails con MongoDB, si te ha gustado y deseas continuar continuar con el proceso de aprendizaje, puedes revisar acerca de las relaciones embebidas, procesos de validación, relaciones de anidamiento y operadores de búsqueda y agregación.

Johan
Johan
johan.tique

138Puntos

hace 4 años

Todas sus entradas
Escribe tu comentario
+ 2
2
21861Puntos
4 años

Excelente post. Siempre había usado rails con ORM, pero estaría muy bien comenzar a utilizarlo con ODM.
Gracias por este post, excelente introducción.

2
13928Puntos
4 años

Muy bien, yo no se rails , pero quiero aprender sin duda seguiré sus cursos.