ActiveRecord - Modelos
ActiveRecord es la capa que nos permite acceder y manipular la información de la base de datos sin necesidad de escribir [SQL (Structured Query Language)](SQL (Structured Query Language)).
El concepto más importante de ActiveRecord es el modelo. Un modelo es una clase de Ruby que representa una tabla en la base de datos:
1
class Product < ActiveRecord::Base
2
end
Copied!
Por convención, el nombre de la tabla es el mismo nombre del modelo pero sin capitalizar y en plural (products en este caso).
En el modelo no se definen las columnas de la tabla explícitamente, ActiveRecord las toma de la tabla directamente.

Nuestro primer modelo

Aunque es posible crear la tabla y el modelo manualmente, es más fácil utilizar el generador rails generate model desde la línea de comandos.
Por ejemplo, para crear un modelo Product con los campos name, description y price ejecuta el siguiente comando:
1
$ rails generate model Product name description:text price:decimal
Copied!
    Puedes escribir generate ó, más corto, g.
    El nombre del modelo puede estar en minúscula o capitalizado. Si tiene varias palabras como Product Order puedes escribir product_order o ProductOrder.
    Los campos se separan por espacio.
    Puedes definir el tipo del campo utilizando : seguido del tipo de datos (sin espacios!).
    Los tipos más comunes son: string, text, integer, decimal, date, time, datetime, boolean y references.
    Si el tipo es string puedes definir la longitud con llaves al final: string{10}
    Si omites el tipo del campo se asume que es string{255}.
    Los campos id (llave primaria), created_at y updated_at se crean de forma automática, no hay necesidad de especificarlos en el comando.
El comando anterior va a crear varios archivos, entre esos:
    El modelo (La clase Product) en app/models/product.rb.
    Un archivo en db/migrate con las instrucciones para crear la tabla. A esto se le conoce como una migración.
Para crear la tabla debes ejecutar:
1
$ rails db:migrate
Copied!
Nuestro primer modelo ha sido creado!

Utilizando nuestro modelo

Con un modelo podemos listar, crear, modificar y eliminar registros de la tabla que representa. A esto se le conoce como el CRUD por las siglas (Create, Read, Update, Delete)

Creando un registro

1
arroz = Product.new(name: "Arroz", description: "...", price: 12000)
2
arroz.save
3
`
Copied!
Existe una forma equivalente pero más corta:
1
arroz = Product.create(name: "Arroz", description: "...", price: 12000)
Copied!

Actualizando registros

1
product = Product.find(1)
2
product.name = "Leche"
3
product.save
Copied!
Una forma equivalente pero más corta es la siguiente:
1
product = Product.find(1)
2
product.update(name: "Leche")
Copied!
También es posible actualizar varios registros a la vez utilizando update_all:
1
# actualiza el precio de todos los productos a 1000
2
Product.update_all(price: 1000)
Copied!

Eliminando registros

1
product = Product.find(1)
2
product.destroy
Copied!

Listando registros

1
# retorna una colección con todos los productos
2
products = Product.all
Copied!
1
# retorna el primer usuario, también existe el método .last
2
product = Product.first
Copied!
1
# retorna el producto con id 1
2
product = Product.find(1)
Copied!
1
# retorna el primer producto con nombre Arroz
2
product = Product.find_by(name: "Arroz")
Copied!
Otra forma equivalente de hacer lo anterior es:
1
# retorna el primer producto con nombre arroz
2
product = Product.where(name: "Arroz").take
Copied!
El método where se utiliza para hacer consultas complejas y retorna una colección de registros. (Por eso nos toca hacer el take en el ejemplo anterior, take obtiene el primer elemento de la colección.
where también puede recibir una cadena para crear consultas más complejas:
1
expensive_products = Product.where("price > 5000")
Copied!
Por temas de seguridad (especialmente cuando las condiciones vienen de los usuarios) y por rendimiento se recomienda cambiar el ejemplo anterior por lo siguiente:
1
expensive_products = Product.where("price > ?", 5000)
Copied!
Los signos de interrogación se van a reemplazar por los siguientes argumentos del where en el orden en el que aparecen.

Ordenando registros

Puedes utilizar el método order para ordenar los registros por alguna columna.
Por ejemplo, para ordenar todos los productos por fecha de creación:
1
products = Product.all.order(:created_at)
Copied!
Si los queremos de forma descendente:
1
products = Product.all.order(created_at: :desc)
Copied!

Limitar el número de registros

Puedes utilizar el método limit y offset para limitar el número de registros y saltar algunos respectivamente.
Por ejemplo, para traer máximo 5 productos:
1
products = Product.limit(5)
Copied!
Para traer máximo 5 productos pero saltar los primeros 30:
1
products = Product.limit(5).offset(30)
Copied!

Iterando sobre los registros

1
products = Product.all
2
products.each do |product|
3
puts product.name # o lo que quieras hacer con cada producto
4
end
Copied!

Errores comunes

Quizá el error más común es utilizar Product (capitalizado) cuando debes utilizar product (sin capitalizar) y viceversa.
En general, product sin capitalizar sólo lo utilizas si has creado una variable con ese nombre. Por ejemplo:
1
product = Product.first # eso guarda el primer producto en la variable product
Copied!
Si quieres acceder a la información que está product o modificarlo utilizarías product sin capitalizar:
1
puts product.name
2
product.update(name: "Leche")
Copied!

Métodos que invocas sobre la clase

Los siguientes son los métodos más comunes que invocas directamente sobre la clase, algunos retornan un único registro, otros una colección de registros:
1
Product.all # retorna una colección
2
Product.first # retorna un único registro
3
Product.last # retorna un único registro
4
Product.find(3) # retorna un único registro
5
Product.find_by(name: "algo") # retorna un único registro
6
Product.where(name: "algo") # retorna una colección
Copied!

Métodos que invocas sobre un registro

Asumiendo que primero ejecutamos:
1
product = Product.first
Copied!
Los métodos que generalmente vas a invocar sobre una instancia (que representa un registro) son:
1
product.name # los campos de la tabla
2
product.name = "algo"
3
product.save
4
product.update(name: "algo")
5
product.destroy
Copied!
Last modified 3yr ago