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
<aside> ⌛ Temps indicatif : 1h
</aside>
string
et non un integer
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
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
Utiliser un ENUM au lieu de AASM
Utiliser success
de AASM → https://github.com/aasm/aasm?tab=readme-ov-file#lifecycle
Le callback success
ne garanti pas que la sauvegarde en bdd s’est opéré
Nous avons eu le soucis sur Iris Platform : https://captive-team.atlassian.net/browse/IRIS-476
Exemple de PR qui remplace success
: https://github.com/Captive-Studio/iris-platform/pull/110/files#diff-26bbec4be8ce33f60fa824e2bd29e6902e57541818578634bea06bce180b620eR150
Utiliser les after_commit
sans la gem after_commit_everywhere
AASM a son propre mécanisme de gestion de l'after_commit
, qui peut ne pas être parfaitement synchronisé avec les véritables transactions de base de données gérées par ActiveRecord
. La gem after_commit_everywhere
renforce le comportement d'after_commit
en faisant en sorte que le callback soit exécuté seulement après la validation complète de la transaction ActiveRecord
. ( https://github.com/aasm/aasm?tab=readme-ov-file#transaction-support)
Exemple de PR qui ajoute un after_commit
avec la gem sur Iris : https://github.com/Captive-Studio/iris-platform/pull/523