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!