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.





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 ?
Il utilise limit et startkey (et définit « skip » à 0).