PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Abrufen von Informationen von einem Rails-Server zu einem anderen

Es gibt viele Tutorials zur Verwendung mehrerer Datenbankverbindungen in Rails sowie zum Erstellen einer API in Rails. Ein paar Minuten googeln wird Ihnen viele Beispiele geben. Aber hier sind ein paar Barebone-Ansätze:

Bei mehreren Datenbankverbindungen haben Sie recht, Sie müssen die Verbindungsinformationen für beide Datenbanken in Ihrer database.yml definiert haben Datei. Beispiel:

# 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 macht mit diesem zusätzlichen Block jedoch nichts, es sei denn, Sie sagen es ausdrücklich dazu. Üblicherweise wird ein abstraktes ActiveRecord-Modell definiert, das die zweite Verbindung herstellt:

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

Erstellen Sie dann neue Modelle für Tabellen, die sich in Ihrer Berichtsdatenbank befinden und von ReportingRecord erben statt 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

Um eine API zu erstellen, gibt es unzählige verschiedene Möglichkeiten, dies zu tun. Unabhängig von Ihrem Ansatz empfehle ich Ihnen dringend, sicherzustellen, dass nur über HTTPS darauf zugegriffen werden kann. Hier ist ein einfacher Controller mit einer Aktion, die auf JSON-Anfragen reagiert:

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

Dieses Beispiel würde erfordern, dass Sie ein Zugriffstoken in Ihrer config/secrets.yml definieren Datei:

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)

Die Wahl zwischen einer API- und einer Multiple-DB-Lösung hängt hauptsächlich davon ab, wie Ihre Anwendung in Zukunft expandieren könnte. Der Ansatz mit mehreren DBs ist in der Regel einfacher zu implementieren und weist eine höhere Leistung auf. Eine API neigt dazu, horizontal besser zu skalieren, und Datenbanken, die eine Verbindung von nur einer Anwendung anstatt von zwei oder mehr haben, sind im Laufe der Zeit einfacher zu warten.

Hoffe, das hilft!