sql >> Base de Datos >  >> RDS >> PostgreSQL

Obtener información de un servidor Rails a otro

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!