Istnieje wiele samouczków na temat korzystania z wielu połączeń z bazą danych w Railsach, a także budowania API w Railsach. Kilka minut Googlingu da ci mnóstwo przykładów. Ale oto kilka podejść szkieletowych:
W przypadku wielu połączeń z bazą danych masz rację, musisz mieć informacje o połączeniu dla obu baz danych zdefiniowane w pliku database.yml
plik. Przykład:
# 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
Railsy nie zrobią nic z tym dodatkowym blokiem, chyba że wyraźnie mu to powiesz. Powszechną praktyką jest zdefiniowanie abstrakcyjnego modelu ActiveRecord, który ustanowi drugie połączenie:
class ReportingRecord < ActiveRecord::Base
establish_connection( "#{Rails.env}_reporting_db".to_sym )
self.abstract_class = true
end
Następnie utwórz nowe modele dla tabel, które znajdują się w Twojej bazie danych raportowania i dziedziczą z ReportingRecord
zamiast 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
Istnieje mnóstwo różnych sposobów tworzenia API. Niezależnie od Twojego podejścia, zdecydowanie sugeruję, abyś upewnił się, że jest dostępny tylko przez HTTPS. Oto podstawowy kontroler z jedną akcją, która odpowiada na żądania 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
Ten przykład wymagałby zdefiniowania tokena dostępu w pliku config/secrets.yml
plik:
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)
Wybór między interfejsem API a rozwiązaniem z wieloma bazami danych zależy głównie od tego, jak Twoja aplikacja może się rozwijać w przyszłości. Podejście z wieloma bazami danych jest zazwyczaj łatwiejsze do wdrożenia i ma wyższą wydajność. API ma tendencję do lepszego skalowania w poziomie, a bazy danych, które mają połączenie tylko z jednej aplikacji zamiast z 2 lub więcej, są z czasem łatwiejsze w utrzymaniu.
Mam nadzieję, że to pomoże!