CouchDB e Rails: la gemma sul divano

10 novembre 2009

In questo articolo, che vuole essere il follow-up di Introduzione a CouchDB, ci focalizzaremo sui passaggi necessari a relazionare questo database document-oriented ad un applicazione scritta utilizzando Ruby on Rails.

Impareremo a conoscere CouchRest; una valida alternativa ad ActiveRecord capace di interfacciarsi con CouchDB senza invalidare il pattern MVC che sottende questo framework Web.

Nonostante l’intera architettura sia lungi dall’essere matura, le potenzialità che già esprime sono tali da giustificarne l’implementazione e lo studio; assisteremo, a breve, ad un rafforzarsi di queste tecnologie, che diverranno standard de-facto per la risoluzione di tutta una serie di problematiche legate a dati disomogenei tra di loro.

CouchRest: CouchDB on Ruby

CouchRest offre una serie di metodi per dialogare con CouchDB utilizzando Ruby. Per installarlo è sufficiente digitare:

gem install jchris-couchrest -a http://gems.github.com

A questo punto, eseguendo una sessione irb e digitando:

>> require 'rubygems'
=> false
>> require 'couchrest'
=> true

potremo sperimentare alcune delle funzionalità di questa interessante gemma; ad esempio eseguendo:

>> db = CouchRest.database!("http://localhost:5984/travels")
=> #<CouchRest::Database:0x1013f0438 ...

assoceremo alla variabile db l’handler della connessione al database travel (il punto esclamativo, abbiamo chiamato ‘database!’ e non ‘database’, fa in modo che il database venga creato in caso non dovesse esistere).

Come è facile notare l’identificativo della connessione è specificato tramite un url HTTP, questo perché CouchDB dialoga in JSON attraverso un interfaccia RESTful su protocollo HTTP; le operazioni CRUD sono quindi, come vedremo, equiparabili di fatto alla gestione classica di una risorsa Rails.

Una volta ottenuto l’handler di connessione diventa molto semplice eseguire le classiche azioni di salvataggio, modifica, e recupero dei dati salvati; facciamo un esempio:

>> attributes = { "type" => "Travel", "destination" => "Madrid", "price_per_person" => 1200, "updated_at" => Time.now }
=> {"updated_at"=> ...
>> result = db.save_doc(attributes)
=> {"rev"=>"2-1128495433", "id"=>"8efc1ef0a44584a02b2dbbf77cbf1f37", "ok"=>true}
>> record = db.get(result['id'])
=> {"_rev"=>"1-1128495433", "updated_at"=>"2009/10/11 14:36:40 +0000", "destination"=>"Madrid", "_id"=>"8efc1ef0a44584a02b2dbbf77cbf1f37", "price_per_person"=>1200, "type"=>"Travel"}
>> record["destination"] = "Barcellona"
=> "Barcellona"
>> result = db.save_doc(record)
=> {"rev"=>"3-1888613028", "id"=>"8efc1ef0a44584a02b2dbbf77cbf1f37", "ok"=>true}

Ecco quanto accade in queste poche righe di codice:

L’istruzione save_doc comunica a CouchDB la necessità di salvare un documento; se all’interno dell’hash degli attributi non vi è la chiave _id (come in questo caso) il documento viene creato, altrimenti il documento con id corrispondente a quello della chiave _id viene aggiornato, a patto che il valore della chiave _rev sia lo stesso sia su CouchDB che nell’hash del documento (questo per prevenire errori di coerenza generati da operazioni di scrittura/lettura concorrenti).

L’istruzione get recupera dal database il documento con id equivalente a quello passato come parametro. In questo caso nella variabile record verrà memorizzato l’hash relativo al documento salvato nell’istruzione precedente.

Dopo aver eseguito queste istruzioni è possibile studiarne il risultato utilizzando Futon.

Se vuoi aggiornamenti su CouchDB e Rails: la gemma sul divano inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su CouchDB e Rails: la gemma sul divano

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy