Migrado una aplicación de PHP a Ruby On Rails

August 19, 2020

railsphp

Migrar proyectos existentes sobre todo de PHP hacia una version actualizada o un nuevo framework muchas veces puede ser algo tedioso y complicado ya que necesitamos mantener o migrar la información que ya esta almacenada en la base de datos.

Desde que conoci Ruby on Rails me parecio un framework perfecto para el desarrollo agil y prototipado (no es que no sea un lenguaje para produccion, es usado por Twitter y Github en produccion) debido a su flexibilidad, sencillez y que permite escalar rapidamente.

Paso 1 - Crear la aplicacion de Rails

$ rails new [APP_NAME] -d mysql

Paso 2 - Configuremos la BD

Creamos un volumen para no perder la informacion al terminar los procesos:

$ docker volume create mysql-db-data

Descargamos la imagen de Docker con MySQL y agregamos el volumen para persistir los datos.

$ docker run -d -p 3306:3306 --name mysql-db  -e MYSQL_ROOT_PASSWORD=secret --mount src=mysql-db-data,dst=/var/lib/mysql mysql

Cargar la Base de datos dentro del contenedor:

 # en mi caso estoy probando la terminal de windows
 & cmd.exe /c "docker exec -i mysql-db mysql -psecret pollitos < pollitos.sql"

Luego podemos ingresar a la base de datos con el siguiente comando:

$ docker exec -it mysql-db mysql -p

y ahora en database.yml agregaremos las configuraciones necesarias para conectarnos al servirdor

default: &default
adapter: mysql2
encoding: utf8
pool: 5
username: <% your db server username %>
password: <% your db server password %>
socket: /var/run/mysqld/mysqld.sock
development:
<<: *default
database: <% your existing db name %>

Paso 3 - Instalando las dependencias (gemas) necesarias

$  gem install schema_to_scaffold

Paso 4 - Generaremos el schema

Generaremos el archivo schema.rb basado en la base de datos existente

$  rails db:schema:dump

Paso 5 - Generaremos los comandos de Scaffolding

$ scaffold -c -p ~/path_to_rails_app/db/schema.rb

Paso 6 - Actualicemos un poco las tablas para seguir las convenciones de Rails

CREATE TABLE table_name (
    .
    .
    created_at DATETIME DEFAULT NULL,
    updated_at DATETIME DEFAULT NULL
);

Paso 7 - Ejecuteremos los comandos para generar los CRUD

$ rails generate scaffold Article title:string body:text

Paso 8 - Eliminaremos los archivos de migracion

$ rm -rf ~/path_to_rails_app/db/migrate

Paso 9 - Vamos con Rails!

$ rails s