En esta guía vamos a conocer como se podemos hacer uso de la base de datos PostgreSQL en nuestro proyecto Ruby on Rails.
Lo más habitual es que cuando comencemos un proyecto, desde el departamento de arquitectura nos faciliten ya el esqueleto montado de nuestra nueva futura aplicación molona con todo lo que necesitamos para comenzar a trabajar, pero también se puede dar el caso de que por nuestra cuenta queramos ir aprendiendo a usar ActiveRecord si todavía no estamos en un proyecto que tenga la suerte de usarlo, por lo que a continuación veremos como hacerlo desde cero.
Si queremos tener un proyecto de referencia podemos usar el generador ns_cli para genera un proyecto Rails que por defecto está configurado con PostgreSQL.
Rails incorpora un generador bastante potente para que podamos comenzar nuestro nuevo proyecto sin mucha dificultad, así que lo vamos a usar para nuestro propósito:
rails new demo_app --database postgresqlTras ejecutar esto, tendremos disponible nuestra nueva app en la carpeta demo_app.
Entre todos los archivos que Rails ha generado por nosotros, nos interesan los siguientes:
Gemfileconfig/application.rbconfig/database.ymlapp/models/application_record.rb
Deberemos de configurar con que usuario nos conectaremos a postgresql. Para ello debemos:
- Tener un usuario con permisos, por ejemplo un superuser:
sudo -u postgres createuser --superuser <name>
- Crear el archivo
.env.localy.env.test.localen la raiz del proyecto con los datos del usuaruio:
# En .env.local
POSTGRES_USER=<name>
Este es el archivo, como ya sabrás, dónde se especifican todas las dependencias de nuestra aplicación. Si bien ActiveRecord ya viene incluído en el propio Rails cuando lo instalamos, necesitamos instalar una gema que nos permita comunicarnos con PostgreSQL. Esa gema se llama pg y podemos verla especificada en el Gemfile.
# Use postgresql as the database for Active Record
gem 'pg', '>= 0.18', '< 2.0'En este archivo, que se carga al comienzo de la ejecución de Rails, en la parte superior vemos la siguiente línea:
require 'rails/all'Aunque también podemos encontrarnos en proyectos antiguos una versión desglosada de todas las dependencias: son equivalentes, sólo que con la primera forma cargamos todas las que usa Rails por defecto mientras que con la segunda forma nos va a permitir elegir sólo aquellas partes que nos interesen.
require 'rails'
# Pick the frameworks you want:
require 'active_model/railtie'
require 'active_job/railtie'
require 'active_record/railtie'
require 'active_storage/engine'
require 'action_controller/railtie'
require 'action_mailer/railtie'
require 'action_view/railtie'
require 'action_cable/engine'
require 'action_cable/server'
# require "sprockets/railtie"
# require "rails/test_unit/railtie"Si nos fijamos con detalle, estamos cargando el railtie (módulo) de ActiveRecord para usarlo.
En este archivo de configuración YAML se encuentra toda la información que ActiveRecord necesita para conectarse a nuestra base de datos: dirección de la máquina, usuario, contraseña y el adaptador que debe usar para cada uno de los entornos de trabajo, por defecto development, test y production.
default: &default
adapter: postgresql
encoding: unicode
# For details on connection pooling, see Rails configuration guide
# http://guides.rubyonrails.org/configuring.html#database-pooling
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
development:
<<: *default
database: demo_app_development
test:
<<: *default
database: demo_app_test
production:
<<: *default
url: <%= ENV['DATABASE_URL'] %>Nota: el archivo original incluye comentarios que han sido suprimidos en esta guía por comodidad, ya que no son relevantes para nuestra forma de trabajo.
ActiveRecord soporta multiples bases de datos, como PostgreSQL, MySQL, SQLite, Oracle, etc por lo que necesitamos especificar en este archivo de configuración qué adaptador tiene que usar para conectarse. Como en nuestro caso siempre vamos a trabajar con PostgreSQL tanto para desarrollar, como para pasar los tests o levantar nuestra app en producción, podemos definir una sección de configuración global, llamada default, de la cual heredarán cada uno de los entornos, cambiando solo lo que le hace falta en particular.
Y por último, Rails define este archivo como una base para que todos nuestros modelos hereden de él. Tiene la siguiente estructura:
class ApplicationRecord < ActiveRecord::Base
self.abstract_class = true
endEl objetivo es que sirva de forma análoga al ApplicationController: definir comportamiento común que tengan que tener todos los modelos que hereden de él. Por norma general no tendremos que tocar mucho este archivo.
Para el correcto funcionamiento de nuestra aplicación es necesario que configuremos Rails con dos directivas importantes. Dicha configuración deberá realizarse en el archivo config/application.rb:
config.load_defaults 5.2
config.active_record.schema_format = :sqlLa primera posiblemente ya la tengas definida, y sirve para que Rails configure por nosotros una serie de elementos por defecto según la convención establecida para la versión 5.2. La segunda directiva le indica a ActiveRecord que el esquema global de la base de datos lo queremos en formato SQL en lugar de usar un archivo de Ruby. Esto es necesario ya que ciertos usos avanzados de la base de datos de PostgreSQL que haremos en nuestra aplicación no pueden ser replicados usando el formato de Ruby, con lo que perderíamos funcionalidad.
Cuando trabajamos en desarrollo, necesitaremos usar al menos dos bases de datos: la del entorno development y la del entorno test. El nombre que tiene cada una de ellas es el que hemos especificado en el archivo config/database.yml, prestando mucha atención a que sean distintos para evitar que se sobreescriban los datos durante la ejecución de los tests.
Para crear esas bases de datos Rails tiene el siguiente comando:
rails db:createSiguiendo con el ejemplo anterior, si lo ejecutásemos, se crearían en PostgreSQL las siguientes bases de datos:
demo_app_developmentdemo_app_test
Y de forma ánaloga, si ya no queremos hacer uso de esas bases de datos las podemos borrar ejecutando:
rails db:dropEn esta guía hemos aprendido a inicializar un proyecto Rails preparado para conectarse a PostgreSQL desde cero y a entender como se organizan y para qué sirven los archivos de configuración o de trabajo relacionados. Por último, hemos aprendido un par de comandos útiles para inicializar y borrar las bases de datos del proyecto.