Er zijn tal van tutorials over het gebruik van meerdere databaseverbindingen in Rails en het bouwen van een API in Rails. Een paar minuten Googlen geeft je genoeg voorbeelden. Maar hier zijn een paar barebone-benaderingen:
Voor meerdere databaseverbindingen hebt u gelijk, u moet de verbindingsinformatie voor beide databases hebben gedefinieerd in uw database.yml
het dossier. Voorbeeld:
# 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 zal echter niets doen met dit extra blok, tenzij je het expliciet aangeeft. De gebruikelijke praktijk is om een abstract ActiveRecord-model te definiëren dat de tweede verbinding tot stand zal brengen:
class ReportingRecord < ActiveRecord::Base
establish_connection( "#{Rails.env}_reporting_db".to_sym )
self.abstract_class = true
end
Maak vervolgens nieuwe modellen voor tabellen die zich in uw rapportagedatabase bevinden en erven van ReportingRecord
in plaats van 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
Voor het bouwen van een API zijn er talloze verschillende manieren om dit te doen. Ongeacht uw aanpak, raad ik u ten zeerste aan ervoor te zorgen dat deze alleen toegankelijk is via HTTPS. Hier is een basiscontroller met één actie die reageert op json-verzoeken:
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
In dit voorbeeld moet u een toegangstoken definiëren in uw config/secrets.yml
bestand:
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)
Kiezen tussen een API en een oplossing met meerdere databases hangt grotendeels af van hoe uw toepassing in de toekomst zou kunnen uitbreiden. De benadering met meerdere databases is doorgaans eenvoudiger te implementeren en levert betere prestaties. Een API heeft de neiging om horizontaal beter te schalen en databases die een verbinding hebben van slechts één applicatie in plaats van twee of meer, zijn over het algemeen gemakkelijker te onderhouden in de loop van de tijd.
Ik hoop dat dit helpt!