Entrada

Cómo usar el ORM de Ruby on Rails

Cómo usar el ORM de Ruby on Rails

El ORM de Ruby on Rails se llama Active Record, y es una de las partes más poderosas del framework. Gracias a él puedes trabajar con bases de datos usando objetos Ruby, sin escribir SQL manual (aunque puedes hacerlo cuando lo necesites).

En este post construiremos un ejemplo simple usando el ORM, donde gestionaremos libros, autores y categorías. Veremos cómo crear el proyecto, configurar la base de datos, generar modelos, migrar tablas y realizar consultas típicas.

¿Qué es Active Record?

Active Record es la capa del MVC encargada de gestionar los datos. Cada tabla de la base de datos se representa como una clase Ruby, y cada fila como un objeto.

Ejemplo:
La tabla users corresponde al modelo:

1
2
class User < ApplicationRecord
end

1. Setup Rails

Para comenzar con el setup de Rails, lo primero es preparar el entorno y crear un nuevo proyecto.

  • 1. Abrir una línea de comandos (Terminal)
    Presiona la combinación Cmd + Space para abrir el Spotlight, luego escribe “Terminal” y presiona Enter.

    Abrir Terminal

    2. Navegar a la ubicación deseada
    Una vez que tengas la terminal abierta, usa el comando cd para cambiar a la ubicación donde trabajarás tu proyecto. Por ejemplo, si deseas ir a la carpeta Documentos:
    1
    
    cd ~/Documents/
    
    3. Crear el proyecto
    Usando el comando rails seguido del nombre para el proyecto y le indicamos que lo configure para usar Postgres. Por ejemplo:
    1
    
    rails new bookstore -d postgresql
    

    Puedes usar SQLite si quieres, solo cambia la opción -d sqlite3.

    4. Ingresar al proyecto
    Con el comando cd accede al proyecto generado:
    1
    
    cd bookstore
    
    5. Crear la base de datos
    Con el comando db le podemos decir que proceda a crear la base de datos:
    1
    
    rails db:create
    

    Cuando instalas PostgreSQL con Homebrew, se crea automáticamente un rol en Postgres con el mismo nombre que tu usuario de macOS. Por eso, al ejecutar rails db:create sin especificar usuario ni contraseña, Rails usa ese rol por defecto y la base de datos se crea sin problemas.

  • 1. Abrir una línea de comandos (Terminal)
    Presiona la combinación Ctrl + Alt + T para abrir la Terminal:

    Abrir Terminal

    2. Navegar a la ubicación deseada
    Una vez que tengas la terminal abierta, usa el comando cd para cambiar a la ubicación donde trabajarás tu proyecto. Por ejemplo, si deseas ir a la carpeta Documentos:
    1
    
    cd ~/Documents/
    
    3. Crear el proyecto
    Usando el comando rails seguido del nombre para el proyecto y le indicamos que lo configure para usar Postgres. Por ejemplo:
    1
    
    rails new bookstore -d postgresql
    

    Puedes usar SQLite si quieres, solo cambia la opción -d sqlite3.

    4. Ingresar al proyecto
    Con el comando cd accede al proyecto generado:
    1
    
    cd bookstore
    
    5. Crear la base de datos
    Con el comando db le podemos decir que proceda a crear la base de datos:
    1
    
    rails db:create
    

    Cuando instalas PostgreSQL con Homebrew, se crea automáticamente un rol en Postgres con el mismo nombre que tu usuario de macOS. Por eso, al ejecutar rails db:create sin especificar usuario ni contraseña, Rails usa ese rol por defecto y la base de datos se crea sin problemas.

  • 1. Abrir una línea de comandos o símbolo de sistema (CMD)
    Presiona la combinación Win + R para abrir la ventana de “Ejecutar” y escribe “cmd”.

    Ejecutar CMD

    2. Navegar a la ubicación deseada
    Con el comando cd cambiamos a la ubicación donde trabajarás tu proyecto. Por ejemplo:
    1
    
    cd %UserProfile%\Documents
    
    3. Crear carpeta con el nombre del proyecto y entrar en ella
    Usando el comando mkdir se crea la carpeta y luego con cd accedes a la misma:
    1
    
    mkdir bookstore && cd bookstore
    

Comprobamos la creación de la base de datos:

Db y rol Db y rol

2. Crear los modelos

En el proyecto bookstore se definen tres modelos principales que conforman la base del dominio de la aplicación:

  • Book: representa el libro.
  • Author: representa un autor.
  • Category: representa una categoría literaria.

Estas relaciones y atributos se encuentran representados en el siguiente diagrama de clases:

classDiagram
  class Author {
    id : integer
    name : string
    bio : text
    created_at : datetime
    updated_at : datetime
  }

  class Category {
    id : integer
    name : string
    created_at : datetime
    updated_at : datetime
  }

  class Book {
    id : integer
    title : string
    price : decimal
    author_id : integer
    category_id : integer
    created_at : datetime
    updated_at : datetime
  }

  Author "1" --> "0..*" Book : escribe
  Category "1" --> "0..*" Book : clasifica
1
2
3
rails generate model Author name:string bio:text
rails generate model Category name:string
rails generate model Book title:string price:decimal author:references category:references

Rails generará:

  • Los modelos dentro de app/models/
  • Las migraciones dentro de db/migrate/

Modelos Modelos Modelos

En la imagen se observa la definición de los modelos del proyecto y sus relaciones dentro de una aplicación con Rails:

  • Author y Category son modelos base que heredan de ApplicationRecord y representan entidades independientes del sistema.
  • Book es el modelo central y establece relaciones mediante belongs_to con Author y Category, lo que indica que cada libro está asociado a un autor y a una categoría.
  • Esta estructura refleja una relación uno a muchos, donde un autor puede tener varios libros y una categoría puede agrupar múltiples libros.

Migraciones Migraciones Migraciones

En la imagen se muestra la definición de las migraciones de base de datos del proyecto:

  • Se observan las migraciones para Author, Category y Book, encargadas de crear las tablas correspondientes en la base de datos.
  • Las tablas authors y categories contienen atributos básicos como name y marcas de tiempo (timestamps).
  • La tabla books incluye atributos propios (title, price) y referencias (author y category) con claves foráneas, asegurando la integridad referencial.
  • Esta configuración refleja a nivel de base de datos las relaciones definidas previamente en los modelos.

3. Aplicar las migraciones

Usando el comando rails db ejecutas la migración:

1
rails db:migrate

Migración Migración

4. Relacionar los modelos con Active Record

Rails ya conoce las relaciones gracias a references, pero las debemos declarar en los modelos.

app/models/author.rb

1
2
3
class Author < ApplicationRecord
  has_many :books
end

app/models/category.rb

1
2
3
class Category < ApplicationRecord
  has_many :books
end

app/models/book.rb

1
2
3
4
class Book < ApplicationRecord
  belongs_to :author
  belongs_to :category
end

Con esto Active Record genera métodos automáticos como:

  • author.books
  • category.books
  • book.author
  • book.category

5. Probando Active Record en la consola (Rails Console)

Podemos interactuar con nuestra base de datos desde:

1
rails console

Crear registros

1
2
3
4
5
6
7
8
9
10
11
12
13
a = Author.create(name: "Gabriel García Márquez")
c = Category.create(name: "Realismo Mágico")

Book.create(
  title: "Cien años de soledad",
  price: 15000,
  author: a,
  category: c
)

# o de forma más controlada:
book = Book.new(title: "El pistolero", price: 20000, author: c, category: cS)
user.save

Consultar registros

1
2
3
Book.first
Book.where(price: 10000..30000)
Author.find_by(name: "Gabriel García Márquez").books

Actualizar

1
2
book = Book.first
book.update(price: 21.99)

Eliminar

1
Book.last.destroy

6. Controladores y rutas (rápido)

Si quieres exponer libros en una API o vistas:

1
rails generate controller Books index show

En config/routes.rb:

1
resources :books

En app/controllers/books_controller.rb:

1
2
3
4
5
6
7
8
9
class BooksController < ApplicationController
  def index
    @books = Book.includes(:author, :category)
  end

  def show
    @book = Book.find(params[:id])
  end
end

Rails ya te da las rutas REST:

  • /books
  • /books/:id

Rails hace que trabajar con una base de datos en un proyecto sea totalmente natural gracias a Active Record. Cada modelo se convierte en una clase Ruby completamente integrada con la base de datos, y las migraciones nos permiten evolucionar la estructura sin dolores de cabeza.

En este pequeño ejemplo ya logramos:

  • Crear el proyecto bookstore
  • Configurar la base de datos
  • Definir modelos y relaciones
  • Migrar tablas
  • Hacer consultas con Active Record
  • Preparar controladores y rutas básicas
Esta entrada está licenciada bajo CC BY 4.0 por el autor.