PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Ottenere informazioni da un server Rails a un altro

Ci sono molti tutorial su come utilizzare più connessioni al database in Rails e sulla creazione di un'API in Rails. Pochi minuti di ricerca su Google ti forniranno molti esempi. Ma ecco un paio di approcci barebone:

Per più connessioni a database, hai ragione, dovrai avere le informazioni di connessione per entrambi i database definite nel tuo database.yml file. Esempio:

# 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

Rails non farà nulla con questo blocco extra, a meno che tu non lo dica esplicitamente. La pratica comune è definire un modello ActiveRecord astratto che stabilirà la seconda connessione:

class ReportingRecord < ActiveRecord::Base
  establish_connection( "#{Rails.env}_reporting_db".to_sym )
  self.abstract_class = true
end

Quindi, crea nuovi modelli per le tabelle che risiedono nel database dei rapporti ed ereditano da ReportingRecord invece di 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

Per creare un'API, ci sono molti modi diversi per farlo. Indipendentemente dal tuo approccio, ti consiglio vivamente di assicurarti che sia accessibile solo tramite HTTPS. Ecco un controller di base con un'azione che risponde alle richieste 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

Questo esempio richiede la definizione di un token di accesso nel tuo config/secrets.yml file:

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)

La scelta tra un'API e una soluzione a più DB dipende principalmente da come la tua applicazione potrebbe espandersi in futuro. L'approccio a più DB è in genere più facile da implementare e offre prestazioni più elevate. Un'API tende a scalare meglio orizzontalmente e i database che hanno una connessione da una sola applicazione invece di 2 o più tendono ad essere più facili da mantenere nel tempo.

Spero che questo aiuti!