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

Hentning af information fra en Rails-server til en anden

Der er masser af tutorials om, hvordan man bruger flere databaseforbindelser i Rails samt opbygning af en API i Rails. Et par minutters google vil give dig masser af eksempler. Men her er et par barebones tilgange:

For flere databaseforbindelser har du ret, du skal have forbindelsesoplysningerne for begge databaser defineret i din database.yml fil. Eksempel:

# 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 vil dog ikke gøre noget med denne ekstra blok, medmindre du udtrykkeligt fortæller det. Den almindelige praksis er at definere en abstrakt ActiveRecord-model, der etablerer den anden forbindelse:

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

Opret derefter nye modeller for tabeller, der ligger i din rapporteringsdatabase og arver fra ReportingRecord i stedet for 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

For at bygge en API er der tonsvis af forskellige måder at gøre det på. Uanset din tilgang, vil jeg stærkt foreslå, at du sørger for, at den kun er tilgængelig via HTTPS. Her er en grundlæggende controller med én handling, der reagerer på json-anmodninger:

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

Dette eksempel kræver, at du definerer et adgangstoken i din config/secrets.yml fil:

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)

Valget mellem en API og en multipel DB-løsning afhænger for det meste af, hvordan din applikation kan udvides i fremtiden. Multiple DB-tilgangen er typisk nemmere at implementere og har højere ydeevne. En API har en tendens til at skalere horisontalt bedre, og databaser, der kun har en forbindelse fra én applikation i stedet for 2 eller flere, har en tendens til at være nemmere at vedligeholde over tid.

Håber dette hjælper!




  1. Hvad er forskellen mellem (*) og .* i regexp?

  2. Hvorfor er PHP PDO DSN et andet format for MySQL versus PostgreSQL?

  3. Sådan erklærer du en markør efter startsektionen af ​​en Oracle PL/SQL-procedure

  4. Hvordan genererer man hele databasescriptet i MySQL Workbench?