Има много уроци за това как да използвате множество връзки към бази данни в Rails, както и за изграждане на API в Rails. Няколко минути гугъл ще ви дадат много примери. Но ето няколко основни подхода:
За връзки с множество бази данни, прав сте, ще трябва да имате информация за връзката и за двете бази данни, дефинирана във вашия database.yml
файл. Пример:
# 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 обаче няма да направи нищо с този допълнителен блок, освен ако изрично не му кажете. Обичайната практика е да се дефинира абстрактен модел ActiveRecord, който ще установи втората връзка:
class ReportingRecord < ActiveRecord::Base
establish_connection( "#{Rails.env}_reporting_db".to_sym )
self.abstract_class = true
end
След това създайте нови модели за таблици, които се намират във вашата база данни за отчитане и наследяват от ReportingRecord
вместо 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
За изграждането на API има много различни начини да го направите. Независимо от вашия подход, бих ви препоръчал да се уверите, че е достъпен само чрез HTTPS. Ето един основен контролер с едно действие, което отговаря на 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
Този пример изисква да дефинирате токен за достъп във вашия config/secrets.yml
файл:
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)
Изборът между API и решение с множество DB зависи най-вече от това как вашето приложение може да се разшири в бъдеще. Подходът с множество DB обикновено е по-лесен за прилагане и има по-висока производителност. Приложният програмен интерфейс (API) има тенденция да се мащабира хоризонтално по-добре и базите данни, които имат връзка само от едно приложение вместо от 2 или повече, обикновено се поддържат по-лесно с течение на времето.
Надявам се това да помогне!