Hay muchos tutoriales sobre cómo usar varias conexiones de base de datos en Rails, así como sobre cómo crear una API en Rails. Unos minutos de búsqueda en Google le darán muchos ejemplos. Pero aquí hay un par de enfoques básicos:
Para conexiones de bases de datos múltiples, tiene razón, necesitará tener la información de conexión para ambas bases de datos definida en su database.yml
expediente. Ejemplo:
# Local Database
development:
adapter: mysql2
database: local_db
username: my_user
password: my_password
host: localhost
port: 3306
# Reporting Database
development_reporting_db:
adapter: postgresql
encoding: unicode
database: reporting
username: some_user
password: some_password
host: 1.2.3.4
port: 5432
Sin embargo, Rails no hará nada con este bloque adicional a menos que se lo indique explícitamente. La práctica común es definir un modelo ActiveRecord abstracto que establecerá la segunda conexión:
class ReportingRecord < ActiveRecord::Base
establish_connection( "#{Rails.env}_reporting_db".to_sym )
self.abstract_class = true
end
Luego, cree nuevos modelos para tablas que residan en su base de datos de informes y herede de ReportingRecord
en lugar de ActiveRecord::Base
:
class SomeModel < ReportingRecord
# this model sits on top of a table defined in database.yml --> development_reporting_db instead of database.yml --> development
end
Para construir una API, hay muchas formas diferentes de hacerlo. Independientemente de su enfoque, le sugiero que se asegure de que solo sea accesible a través de HTTPS. Aquí hay un controlador básico con una acción que responde a solicitudes json:
class ApiController < ApplicationController
before_filter :restrict_access # ensures the correct api token was passed (defined in config/secrets.yml)
skip_before_action :verify_authenticity_token # not needed since we're using token restriction
respond_to :json
def my_endpoint_action
render :json => {some_info: 'Hello World'}, :status => 200 # 200 = success
end
private
rescue_from StandardError do |e|
render :json => {:error => e.message}.to_json, :status => 400 # 400 = bad request
end
# ensures the correct api token was passed (defined in config/secrets.yml)
def restrict_access
authenticate_or_request_with_http_token do |token, options|
token == Rails.application.secrets[:my_access_token]
end
end
end
Este ejemplo requeriría que defina un token de acceso en su config/secrets.yml
archivo:
development:
secret_key_base: # normal Rails secret key base
my_api_access_token: # put a token here (you can generate one on the command like using rake secret)
Elegir entre una API y una solución de base de datos múltiple depende principalmente de cómo su aplicación podría expandirse en el futuro. El enfoque de base de datos múltiple suele ser más fácil de implementar y tiene un mayor rendimiento. Una API tiende a escalar mejor horizontalmente y las bases de datos que tienen una conexión desde una sola aplicación en lugar de 2 o más tienden a ser más fáciles de mantener con el tiempo.
¡Espero que esto ayude!