sql >> Databasteknik >  >> RDS >> PostgreSQL

Hämta information från en Rails-server till en annan

Det finns massor av handledningar om hur man använder flera databasanslutningar i Rails samt att bygga ett API i Rails. Ett par minuters googling ger dig massor av exempel. Men här är ett par barebones tillvägagångssätt:

För flera databasanslutningar, du har rätt, du måste ha anslutningsinformationen för båda databaserna definierade i din database.yml fil. Exempel:

# 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 kommer dock inte att göra något med detta extra block om du inte uttryckligen säger åt det. Vanlig praxis är att definiera en abstrakt ActiveRecord-modell som kommer att upprätta den andra anslutningen:

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

Skapa sedan nya modeller för tabeller som finns i din rapportdatabas och ärver från ReportingRecord istället för 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

För att bygga ett API finns det massor av olika sätt att göra det. Oavsett ditt tillvägagångssätt, rekommenderar jag starkt att du ser till att den endast är tillgänglig via HTTPS. Här är en grundläggande kontroller med en åtgärd som svarar på json-förfrågningar:

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

Detta exempel kräver att du definierar en åtkomsttoken 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)

Att välja mellan ett API och en multipel DB-lösning beror mest på hur din applikation kan expandera i framtiden. Metoden med flera DB är vanligtvis lättare att implementera och har högre prestanda. Ett API tenderar att skala horisontellt bättre och databaser som har en anslutning från endast en applikation istället för 2 eller fler tenderar att vara lättare att underhålla med tiden.

Hoppas detta hjälper!




  1. Sparar JSON-sträng till MySQL-databas

  2. ODBC/MYSQL Infoga ett frågeresultat från ODBC till en databas i MYSQL

  3. Vilken skulle vara den bästa metoden för att migrera Oracle-databas till MS Access med Java?

  4. Mysql - Byt namn på alla tabeller och kolumner till gemener?