1 What is Active Record?
¿Qué es Active Record?
Active Record es la M en MVC - el modelo - que es la capa del sistema responsable de representar a las empresas datos y lógica. Active Record facilita la creación y el uso de objetos de negocios cuyos datos requieren almacenamiento persistente en una base de datos. Es un implementación del patrón Active Record, que en sí mismo es una descripción de un Sistema de Mapeo Relacional de Objetos.
1.1 The Active Record Pattern
El patrón de Active Record
Active Record fue descrito por Martin Fowler en su libro Patterns of Enterprise Application Architecture. En Active Record, los objetos llevan datos persistentes y comportamiento que opera con esos datos. Active Record considera que garantizar la lógica de acceso a datos como parte del objeto educará a los usuarios de ese objeto sobre cómo escribir y leer de la base de datos.
1.2 Object Relational Mapping
Mapeo Relacional de Objetos
Mapeo relacional de objetos, comúnmente conocido como su abreviatura ORM, es Una técnica que conecta los objetos ricos de una aplicación a tablas en un sistema de gestión de bases de datos relacionales. Usando ORM, las propiedades y Las relaciones de los objetos en una aplicación pueden almacenarse fácilmente y recuperado de una base de datos sin escribir sentencias SQL directamente y con menos código general de acceso a la base de datos.
NOTA: El conocimiento básico de los sistemas de gestión de bases de datos relacionales (RDBMS) y el lenguaje de consulta estructurado (SQL) es útil para comprender completamente Active Record. Consulte este tutorial (o este) o estudíelos por otros medios si te gustaría aprender más.
1.3 Active Record as an ORM Framework
Active Record como marco de referencia ORM
Active Record nos brinda varios mecanismos, el más importante es la habilidad a:
- Representar modelos y sus datos.
- Representar asociaciones entre estos modelos.
- Representar jerarquías de herencia a través de modelos relacionados.
- Valide los modelos antes de que persistan en la base de datos.
- Realizar operaciones de base de datos de manera orientada a objetos.
2 Convention over Configuration in Active Record
Convención sobre configuración en Active Record
Al escribir aplicaciones utilizando otros lenguajes de programación o marcos, puede ser necesario escribir mucho código de configuración. Esto es particularmente cierto para marcos ORM en general. Sin embargo, si sigue las convenciones adoptadas por Rails, necesitará escribir muy poca configuración (en algunos casos no configuración en absoluto) al crear modelos Active Record. La idea es que si configura sus aplicaciones de la misma manera la mayor parte del tiempo, entonces esto debería ser la forma predeterminada. Por lo tanto, se necesitaría una configuración explícita solo en aquellos casos en los que no puede seguir la convención estándar.
2.1 Naming Conventions
Convenciones de nombres
De forma predeterminada, Active Record utiliza algunas convenciones de nomenclatura para averiguar cómo
Se debe crear un mapeo entre modelos y tablas de bases de datos. Rails
pluraliza los nombres de sus clases para encontrar la tabla de base de datos respectiva. Entonces, para
una clase Book
, debe tener una tabla de base de datos llamada books. Los mecanismos
de pluralización de Rails son muy potentes, capaces de pluralizar (y
singularizar) palabras regulares e irregulares. Cuando se usan nombres de clase compuestos
de dos o más palabras, el nombre de la clase modelo debe seguir las convenciones de Ruby,
usando el formulario CajaCamello, mientras que el nombre de la tabla debe contener las palabras separadas
por guiones bajos. Ejemplos:
- Clase de modelo - Singular con la primera letra de cada palabra en mayúscula (p.ej.,
BookClub
). - Tabla de base de datos - Plural con guiones bajos que separan las palabras (p.ej.,
book_clubs
).
Modelo / Clase | Tabla / Esquema |
---|---|
Article |
articles |
LineItem |
line_items |
Deer |
deers |
Mouse |
mice |
Person |
people |
2.2 Schema Conventions
Convenciones de Esquema
Active Record utiliza convenciones de nomenclatura para las columnas en las tablas de la base de datos, dependiendo del propósito de estas columnas.
-
Claves foráneas: Estos campos deben nombrarse siguiendo el patrón
nombre_de_tabla_singularizada_id
(p.ej.,item_id
,order_id
). Estos son los campos que Active Record buscará cuando cree asociaciones entre sus modelos -
Claves primarias - Por defecto, Active Record usará una columna entera llamada
id
como clave principal de la tabla (bigint
para PostgreSQL y MySQL,integer
para SQLite). Cuando se utiliza Migraciones de registros activos Para crear sus tablas, esta columna se creará automáticamente.
También hay algunos nombres de columna opcionales que agregarán características adicionales a instancias de Active Record:
-
created_at
- Se establece automáticamente en la fecha y hora actuales cuando el registro se crea por primera vez. -
updated_at
- Se establece automáticamente en la fecha y hora actuales siempre que El registro se crea o actualiza. -
lock_version
- Agrega optimistic locking para un modelo. -
type
- Especifica que el modelo usa Single Table Inheritance. -
(nombre_ asociación) _type
- Almacena el tipo para asociaciones polimórficas. -
(table_name)_count
- Se usa para almacenar en caché el número de objetos pertenecientes en asociaciones. Por ejemplo, una columnacomments_count
en una claseArticle
que tiene muchas instancias deComentario
almacenará en caché el número de comentarios existentes para cada artículo.
NOTA: Si bien estos nombres de columna son opcionales, de hecho están reservados por Active Record. Manténgase alejado de las palabras clave reservadas a menos que desee la funcionalidad adicional. Por ejemplo, type
es una palabra clave reservada que se usa para designar una tabla usando la herencia de tabla única (Singel Table Inheritance). Si no está utilizando STI, intente con una palabra clave análoga como "contexto", que aún puede describir con precisión los datos que está modelando.
3 Creating Active Record Models
Crear modelos de Active Record
Para crear modelos de Active Record, subclasifique la clase ApplicationRecord
y estará listo:
class Product < ApplicationRecord
end
Esto creará un modelo de Producto
, mapeado a una tabla deproductos
en
base de datos. Al hacer esto, también tendrá la capacidad de mapear las columnas de cada
fila en esa tabla con los atributos de las instancias de su modelo. Suponer
que la tabla productos
fue creada usando una declaración SQL (o una de sus extensiones) como:
CREATE TABLE products (
id int(11) NOT NULL auto_increment,
name varchar(255),
PRIMARY KEY (id)
);
El esquema anterior declara una tabla con dos columnas: id
yname
. Cada fila de
Esta tabla representa un determinado producto con estos dos parámetros. Por lo tanto, usted
sería capaz de escribir código como el siguiente:
p = Product.new
p.name = "Some Book"
puts p.name # "Some Book"
4 Overriding the Naming Conventions
Anulación de las convenciones de nomenclatura
¿Qué sucede si necesita seguir una convención de nomenclatura diferente o si necesita usar su Aplicación Rails con una base de datos heredada? No hay problema, puedes anular fácilmente Las convenciones predeterminadas.
ApplicationRecord
hereda deActiveRecord :: Base
, que define un
Número de métodos útiles. Puede usar el ActiveRecord :: Base.table_name =
Método para especificar el nombre de la tabla que se debe utilizar:
class Product < ApplicationRecord
self.table_name = "my_products"
end
Si lo hace, tendrá que definir manualmente el nombre de la clase que aloja
los accesorios (my_products.yml) usando el método set_fixture_class
en su prueba
definición:
class ProductTest < ActiveSupport::TestCase
set_fixture_class my_products: Product
fixtures :my_products
...
end
También es posible anular la columna que se debe usar como tabla
clave primaria usando el método ActiveRecord :: Base.primary_key =
: método
class Product < ApplicationRecord
self.primary_key = "product_id"
end
NOTA: Active Record no admite el uso de columnas de clave no primaria llamadas id
.
5 CRUD: Reading and Writing Data
CRUD: lectura y escritura de datos
CRUD es un acrónimo de los cuatro verbos que usamos para operar con datos: Create, Read, Update and Delete. Active Record crea automáticamente métodos para permitir que una aplicación lea y manipule datos almacenados dentro de sus tablas.
5.1 Create
Los objetos Active Record se pueden crear a partir de un hash, un bloque o tener su
atributos establecidos manualmente después de la creación. El método new
devolverá un nuevo
object mientras que create
devolverá el objeto y lo guardará en la base de datos.
Por ejemplo, dado un modelo Usuario
con atributos denombre
y ocupación
,
la llamada al método create
creará y guardará un nuevo registro en la base de datos:
user = User.create(name: "David", occupation: "Code Artist")
Usando el método new
, un objeto puede ser instanciado sin ser guardado:
user = User.new
user.name = "David"
user.occupation = "Code Artist"
Una llamada a user.save
confirmará el registro en la base de datos.
Finalmente, si un bloque es proveído, tanto create
comonew
producirá el nuevo
inicializado dentro de un bloque:
user = User.new do |u|
u.name = "David"
u.occupation = "Code Artist"
end
5.2 Read
Active Record provee una rica API para acceder a datos dentro de una base de datos. De abajo son algunos ejemplos de diferentes métodos de acceso a datos por Active Record.
# devuelve una colección de usuarios
users = User.all
# devuelve el primer usuario
user = User.first
# devuelve el primer usuario llamado David
david = User.find_by(name: 'David')
# encontrar todos los usuarios llamados David que tienen de ocupación Code Artists y ordenado por created_at en sentido cronológicamente inverso
users = User.where(name: 'David', occupation: 'Code Artist').order(created_at: :desc)
Puedes aprender más acerca de consultar un modelo Active Record en la guía Active Record Query Interface.
5.3 Update
Una vez que un objeto Active Record ha sido recuperado, sus atributos pueden ser modificados y volver a ser guardados en la base de datos.
user = User.find_by(name: 'David')
user.name = 'Dave'
user.save
Una forma abreviada de esto es usar un nombre de atributo de mapeo hash para el deseado valor, así:
user = User.find_by(name: 'David')
user.update(name: 'Dave')
Esta es la manera más útil al actualizar varios atributos a la vez. Si, por otro lado,
quieres actualizar varios a la vez, encontrarás muy útil el método update_all
:
User.update_all "max_login_attempts = 3, must_change_password = 'true'"
5.4 Delete
Asimismo, una vez que se recupera el objeto Active Record también puede ser destruído, lo cual lo borrará de la base de datos.
user = User.find_by(name: 'David')
user.destroy
Si desea eliminar varios registros de forma masiva, puede usar el método destroy_by
o destroy_all
.
# encontrar y destruir todos los usuarios llamados David
User.destroy_by(name: 'David')
# destruir todos los usuarios
User.destroy_all
6 Validations
Validaciones
Active Record le permite validar el estado de un modelo antes de que se escriba en la base de datos. Existen varios métodos que puede utilizar para verificar su modelos y validar que un valor de atributo no está vacío, es único y no ya en la base de datos, sigue un formato específico y muchos más.
La validación es un tema muy importante a considerar cuando se persiste en la base de datos, por lo que
los métodos save
yupdate
lo toman en cuenta cuando
se ejecutan: return false
cuando una validación falla y no mantuvieron ninguna
operación en la base de datos. Todos estos tienen una contraparte explosiva, bang (que
es, save!
y update!
), que son más estrictos en ese sentido
y arrojan una excepción ActiveRecord::RecordInvalid
si la validación falla.
Un rápido ejemplo para ilustrar:
class User < ApplicationRecord
validates :name, presence: true
end
user = User.new
user.save # => false
user.save! # => ActiveRecord::RecordInvalid: Validation failed: Name can't be blank
Puedes aprender más acerca de validaciones en la guía Active Record Validations guide.
7 Callbacks
Las retrollamadas (callbacks) de Active Record le permiten adjuntar código a ciertos eventos en el ciclo de vida de sus modelos. Esto le permite añadir comportamiento a sus modelos de forma transparente en la ejecución cuando estos eventos ocurren, como cuando se crea un nuevo registro, actualizarlo, destruírlo, etc. Puedes obtener más información sobre las retrollamadas en la Active Record Callbacks guide.
8 Migrations
Rails provee un lenguaje de dominio específico para manejar un esquema de base de datos llamado
migraciones (migrations). Las migraciones son ficheros guardados que se ejecutan contra cualquier
base de datos que Active Record soporte utilizando rake
. Aquí hay una migración que
crea una tabla:
class CreatePublications < ActiveRecord::Migration[6.0]
def change
create_table :publications do |t|
t.string :title
t.text :description
t.references :publication_type
t.integer :publisher_id
t.string :publisher_type
t.boolean :single_issue
t.timestamps
end
add_index :publications, :publication_type_id
end
end
Rails mantiene el historial sobre que fichero fue actualizado en la base de datos y
provee características para deshacer los cambios. Para realmente crear la tabla, deberías ejecutar
bin/rails db:migrate
y para deshacerlo bin/rails db:rollback
.
Nota que el código de arriba es database-agnostic: se puede ejectuar en MySQL, PostgreSQL, Oracle y others. Puedes aprender más acerca de las migraciones en Active Record Migrations guide.
Comentarios Sobre el Contenido
Las guías de rieles se administran y publican en latinadeveloper/railsguides.es en GitHub.
Si lee esta guía y encuentra algún texto o código incorrecto que le interese, no dude en enviar una solicitud de extracción en el repositorio anterior. Consulte el archivo README en GitHub para saber cómo enviar una solicitud de extracción. Please contribute if you see any typos or factual errors.