Je vous ai présenté il y a quelques jours CouchDB.
La librairie que je vous ai présenté dans le précédent article était très bien dans un but éducatif. Mais en pratique, c’est vraiment pas puissant. Aujourd’hui nous allons donc parler de CouchREST.

Commencons par installer le gem. Si vous n’avez pas Rubygems configuré pour Gemcutter, faites le maintenant !

sudo gem install couchrest

Zou ! Maintenant on se connecte, on crée une base et un document dans celle-ci !

require 'rubygems"
require "couchrest"

@db = CouchRest.database!("http://127.0.0.1:5984/my_database")
response = @db.save_doc({:name => 'My Document', :content => 'The content'})
p @db.get(response['id']).inspect

Super, mais jusque la, ça ne va pas beaucoup plus loin que ce que nous avons fait précédemment.
Voyons donc comment créer une classe qui représentera un modèle de données CouchDB.

class Document < CouchRest::ExtendedDocument
    use_database 'my_database'

    property  :name
    property  :content

    timestamps!
end

Nous créons un modèle « Document », qui possèdera les champs name et content. Mais également created_at et updated_at (remplis automatiquement grâce à timestamps!).
Maintenant nous pouvons faire les choses d’une manière similaire de ce que nous faisons avec ActiveRecord.

Créer un nouveau document.

doc = Document.new(:name => 'My Doc', :content => 'The Content')
doc.save!

Récupérer tous les documents existants

docs = Document.all

Et également appeller n’importe quelle vue grâce à des méthodes virtuelles. Par exemple si vous avez une vue « by_name ».

docs = Document.by_name

CouchRest gère même la pagination des documents (avec les méthodes de pagination internes à CouchDB).

docs = Document.all.paginate(:page => 1, :per_page => 10)

Vous pouvez donc utiliser CouchDB de manière particulièrement avancée, comme vous le faites déjà avec ActiveRecord pour vos SGBDR de type SQL.
Cependant avec CouchREST il vous faut toujours gérer la connexion à votre base de données « manuellement », dans un fichiers que vous placez dans config/initializers/ par exemple. Pas super pratique.
Heureusement il existe CouchREST Rails, qui implémente CouchREST (et uniquement CouchREST) mais gère automatiquement la connexion au serveur.

Commencez par installer le plugin.

script/plugin install git://github.com/hpoydar/couchrest-rails.git

Puis générez les divers fichiers de configuration relatifs à celui-ci.

script/generate couch_rest_rails

Vous allez maintenant notamment avoir un fichier config/couchdb.yml, qui contient la configuration relative à CouchDB en fonction de votre environnement.
Voici le contenu par défaut de ce document.

base: &base
 database_prefix:
 database_suffix: _<%= RAILS_ENV %>

development:
  host: localhost
  port: 5984
  <<: *base

test:
  host: localhost
  port: 5984
  <<: *base

A vous de configurer celui-ci comme vous le désirez en fonction de vos divers environnements et de vos besoins :)
Attention : vos modèles CouchREST ne doivent maintenant plus dépendre de ExtendedDocument mais de CouchRestRails::Document

Notre modèle précédent sera donc maintenant ainsi

class Document < CouchRestRails::Document

Redémarrez votre application et accédez directement à chacun de vos documents CouchDB via le modèle approprié :)
Si vous regardez le contenu de votre base de données, vous verrez que CouchREST fonctionne d’une manière similaire aux Single Table Inheritance de ActiveRecord.
Chaque document a un champ « couchrest-type », qui définit le modèle relatif au document.
Vous pouvez donc particulièrement aisément transformer un document en un autre document.

Supposons que vous ayez des documents de type « File » et d’autres de type « Image », vous transformerez toutes vos images en fichiers de la manière suivante.

File.all.each do |file|
    doc['couchrest-type'] = 'Image'
    doc.save!
end

Ne faites pas cela sans avoir intégralement testé toutes les conséquences possibles bien évidemment (sauf si avez le désir de mourir dans d’affreuses souffrances ;) ).

Comme vous le constatez, avec CouchREST, (même si le projet a quelques problèmes de communication), vous pouvez gérer vos données stockées dans CouchDB de manière aussi aisée que toute donnée stockée dans un SGBDR geré par ActiveRecord.

Dans un prochain (et dernier) article à propos de CouchDB, nous ferons un peu de javascript avec les vues, comment les implémenter (avec CouchREST) et comment s’en servir afin de profiter de toutes les fonctionnalités du SGBD.

2 Réponses à “CouchDB et Ruby: CouchREST”

  1. DarkSmith dit :

    Interessant. Pour la pagination est-ce que tu sais comment CouchREST se débrouille ? Utilise-t-il la méthode avec le parametre « skip » (déconseillé car pas performante) ou « the good way » avec limit , startkey et startkey_docid ?

  2. Damien dit :

    Il utilise limit et startkey (et définit « skip » à 0).

Laisser une réponse

 
Fork me on GitHub