sql >> Databáze >  >> RDS >> PostgreSQL

Získávání informací z jednoho serveru Rails na druhý

Existuje spousta návodů, jak používat více databázových připojení v Rails a také vytvářet API v Rails. Pár minut Google vám dá spoustu příkladů. Ale tady je pár barebone přístupů:

Pro více databázových připojení, máte pravdu, budete muset mít informace o připojení pro obě databáze definované ve vašem database.yml soubor. Příklad:

# 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 však s tímto extra blokem nic neudělá, pokud mu to výslovně neřeknete. Běžnou praxí je definovat abstraktní model ActiveRecord, který naváže druhé připojení:

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

Poté vytvořte nové modely pro tabulky, které se nacházejí ve vaší databázi přehledů a zdědí z ReportingRecord místo 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

Pro vytvoření API existuje spousta různých způsobů, jak to udělat. Bez ohledu na váš přístup bych velmi doporučil, abyste se ujistili, že je přístupný pouze přes HTTPS. Zde je základní ovladač s jednou akcí, která odpovídá na požadavky 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

Tento příklad by vyžadoval, abyste definovali přístupový token v souboru config/secrets.yml soubor:

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)

Výběr mezi rozhraním API a řešením s více databázemi závisí především na tom, jak by se vaše aplikace mohla v budoucnu rozšířit. Přístup s více databázemi je obvykle jednodušší na implementaci a má vyšší výkon. Rozhraní API má tendenci se horizontálně škálovat lépe a databáze, které mají připojení pouze z jedné aplikace namísto 2 nebo více, mají tendenci se časem snadněji udržovat.

Doufám, že to pomůže!




  1. Jak pingnu na databázi MySQL a znovu se připojím pomocí PDO

  2. Propojit více tabulek v různých databázích? MySql

  3. Laravel 5 UnexpectedValueException v odpovědi na dotaz kvůli použití dat POINT

  4. Nelze načíst třídu ovladače JDBC 'com.postgresql.jdbc.Driver'