CouchDB e Rails: integrazione con CouchRest e BasicModel

10 novembre 2009

Integrazione con Rails

Quanto mostrato fin qui ci consente di operare liberamente su documenti e database utilizzando Ruby, ma è ben lungi dalle comodità alle quali ci ha abituato ActiveRecord; per avvicinare CouchRest ad un vero e proprio ORM possiamo però utilizzare una versione aggiornata del plugin basic_model, realizzato da Geoffrey Grosenbach, che fornisce una classe base (BasicModel) dalla quale possiamo derivare tutti i modelli della nostra applicazione (un po’ come succede con ActiveRecord::Base).

Dico ‘aggiornata’ in quanto il plugin ufficiale non è rimasto al passo con l’ultima versione di CouchRest, per ovviare ho effettuato alcune piccole modifiche; quindi utilizzeremo la mia versione di BasicModel.

Ultimo prerequisito: l’installazione di couchapp, un piccolo script in python che ci consentirà di definire all’interno dell’applicazione le ‘query’ map-reduce necessarie. Per tutte le informazioni su questa procedura rimando all’ottimo documento ufficiale.

Una volta ultimati i preparativi creiamo l’applicazione rails:

rails trip_archive

Quindi aggiungiamo nel suo config/environment.rb le seguenti dichiarazioni, necessarie per beneficiare di couchrest:

# all'interno del blocco Rails::Initializer.run
    config.gem "jchris-couchrest", :lib => "couchrest"
    config.gem "json"
    config.frameworks -= [ :active_record ]

# alla fine del file, fuori da ogni blocco
    require 'json/add/core'
    require 'json/add/rails'
    ENV['TZ'] = 'UTC'

Completata questa parte scarichiamo ed installiamo il sopraccitato plugin digitando in un prompt posizionato nella root dell’applicazione il seguente comando:

ruby script/plugin install git://github.com/sandropaganotti/basic_model.git

Ora non ci resta che generare il nostro primo modello, per farlo creiamo un file travel.rb nella directory app/models e modifichiamone il contenuto come segue:

class Travel < BasicMode

    def default_attributes
    {	
        "destination"  => nil,
        "partecipants" => [],
        "dates"        => { 
            "from" => Time.now.strftime("%d/%m/%Y"), 
            "to" => nil 
        }
    }
    end
end

Il metodo default_attributes serve, come lo stesso nome sottolinea, per specificare la struttura di partenza da associare ad un documento di questo oggetto. Da notare che il plugin BasicModel aggiungerà automaticamente un attributo con chiave type contenente il nome della classe che il documento rappresenta (quindi gli oggetti creati dalla classe Travel saranno memorizzati con type = 'Travel').

Prima di aprire la console e sperimentare alcune operazioni sul modello appena creato è necessario creare una struttura nella quale memorizzeremo i file JavaScript dei costrutti map-reduce che implementeremo a breve; portiamoci quindi con una shell nella root dell’applicazione e digitiamo:

couchapp generate db/app/trip_archives

dove con trip_archives stiamo specificando il nome del database che utilizzeremo su CouchDB. Ignoriamo per ora il risultato di questo comando e lanciamo script/console per verificare la bontà di quanto sviluppato finora:

>> t1 = Travel.new('trip_archives', {"destination"=>"London", "partecipants"=>["sandro"]})
=> #<Travel:0x101d7cdf8 ...
>> t1.save
...
=> #<Travel:0x101e2c3e8 ...
>> t1.partecipants << "francesca"
=> ["sandro", "francesca"]
>> t1.save
=> #<Travel:0x101e2c3e8 ...

Per osservare i risultati di queste istruzioni possiamo collegarci a Futon e navigare all’interno del database trip_archives dove dovrebbe essere presente un documento con le caratteristiche appena specificate.

Se vuoi aggiornamenti su CouchDB e Rails: integrazione con CouchRest e BasicModel inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su CouchDB e Rails: integrazione con CouchRest e BasicModel

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