Classe templating & versionning

21 juin 2025

Cas d'étude

 Pour ceux qui ont déjà utilisé ActiveRecord et plus particulièrement  les Migrations

Vous avez déjà utilisé des héritages du type :

class CreateUser < ActiveRecord::Migration[5.1] 

En Ruby de base

 on Hérite une classe via < d'une classe sur une autre alors qu'est-ce que ce [5.1] ?

 Remarque : En Ruby tout est objet même une classe via la constante qui la référence donc la ligne est syntaxiquement correct.

Mais si on exécute directement on va obtenir une RuntimeError.

Exemple :

class MaClasse < TemplateClasse; end   

 Réponse : une méthode de classe def self.[](version) de  ActiveRecord::Migration

Ceux qu'on veut obtenir ?

 Imaginons deux versions du template :

class TestV1   
    def output  
        puts 'V1'  
    end  
end  
  
class TestV2  
    def output   
        puts 'V2'  
  
    end  
end  

 On veut pouvoir choisir le template, tel que

class MyClass < Test[2]; end  
  
test = MyClass::new  
test.output  

et la sortie doit être :

V2  

 Alors comment faire ?

La classe Test doit implémenter la fameuse méthode de classe def self.[](version)
class Test  
  
    @@versions = {1 => TestV1, 2 => TestV2}  
    def self.[](version)  
        return (@@versions.include? version)? @@versions[version] : TestV1  
    end  
  
  
end  

 On vient ici pour simplifier mapper en statique sur une variable de classe les templates, dans un usage concret, d'autres mécanismes seraient utilisables.

si la version n'existe pas alors on Fallback sur TestV1.

Remarque : Ruby est hautement dynamique chaque template peux être une ré-implémentation, une surcharge, etc ... de Test en lui même, à grand coup de mixin, (include,extend

Pour aller plus loin

Romain GEORGES

Open Source evangelist & Ruby enthousiast