Xavier Nayrac

Rubyiste accro au TDD, serial blogger, apprenti data scientist, heureux utilisateur de Vim, accordéoniste.
Si vous vous sentez particulièrement généreux, suivez moi sur Twitter.

Ruby - Et si on écrivait un ORM ? - partie 3

| Comments

Niveau : intermédiaire

Cette fois je me dis qu’il faudrait quand même se connecter à la base de données avant d’aller plus loin…

Alors au départ, la connexion est inexistante:

sorm_spec.rb
1
2
3
4
5
6
7
8
9
require './sorm'

describe SORM do
  describe 'connection' do
    it 'is not connected' do
      expect(SORM.connected?).to be false
    end
  end
end

On fait passer ce test très facilement:

sorm.rb
1
2
3
4
5
6
7
require 'sqlite3'

class SORM
  def self.connected?
    false
  end
end

Maintenant on cherche à se connecter à une base de données existante (n’oubliez pas de la créer):

sorm_spec.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
require './sorm'

describe SORM do
  describe 'connection' do
    it 'is not connected' do
      expect(SORM.connected?).to be false
    end

    describe 'after connection' do
      it 'is connected' do
        SORM.connect('test.db')
        expect(SORM.connected?).to be true
      end
    end
  end
end

Pour implémenter cette fonctionnalité, ce à quoi je pense de plus rapide et de plus simple est une variable de classe. Même si on a parfois des scrupules à utiliser les variables de classe parce qu’elles sont partagées aussi par les sous-classes, je me dis que c’est bien le comportement que je voudrais obtenir. Donc voici le code qui fait passer notre test:

sorm.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
require 'sqlite3'

class SORM

  @@db = false

  def self.connect(database_filename)
    @@db = SQLite3::Database.open(database_filename)
  end

  def self.connected?
    @@db ? true : false
  end
end

To be continued

À demain.

Articles connexes

Commentaires