🎯 Intention


On souhaite uniformiser les gestions d’états dans nos différentes applications afin d’utiliser les mêmes outils et éviter des bugs mystérieux

<aside> ✅ Pré-requis

✅ Points clés


<aside> ⌛ Temps indicatif : 1h

</aside>

Etape

Visuel / Exemple


🗃️ Créer la colonne de l’état en BDD

Raison :

La colonne string est théoriquement moins performante qu’un integer mais offre une clarté dans la lecture de la BDD, ainsi qu’une simplicité sur le changement de la liste d’état Exemple : Si j’utilise des integers et que j’ajoute un nouvel état initial, il ne pourra pas prendre la valeur 0 à moins de migrer l’ensemble des données (ce qui peut être pénible)

L’index offre un minimum de performance pour les requêtes

class AjouteEtatPourItems < ActiveRecord::Migration[7.1]
  def change
    add_column :items, :etat, :string, default: :en_attente
    add_index :items, :etat
  end
end

🚦 Configurer la machine à état

Raison :

La gem aasm offre des scopes et des méthodes natives en fonction des différents state définis

class Article < ActiveRecord::Base
	include AASM
	aasm column: :statut do
    state :brouillon, initial: true
    state :publie, :archive
  end
end
# spec/models/article_spec.rb

require "rails_helper"

RSpec.describe Article do
	describe "AASM" do
		let(:article) { Article.new }
	
		it { expect(article).to have_state(:brouillon) }
		it { expect(article).to have_state(:publie) }
		it { expect(article).to have_state(:archive) }
	end
end

Plus d’information sur comment écrire les tests ici


❌ Erreurs type à éviter


🎓Aller plus loin