2009-09-21 5 views
3

J'utilise rspec pour les tests et les scénarios hornsby pour les graphiques d'objets utilisés dans les tests.Rails Models counter_cache initialisation de colonne

Est-ce une bonne pratique d'initialiser les colonnes du cache de compteur à la valeur 0 au lieu de les laisser non initialisées (nul)? Ou devrais-je définir la valeur par défaut dans les migrations qui créent ces colonnes de cache de compteur?

Répondre

8

Oui, vous devez définir la valeur par défaut. Sinon, vous devez effectuer des opérations mathématiques de cas spéciaux pour gérer les valeurs NULL. Imaginons que vous disposiez d'un tableau d'objets de publication et que vous vouliez obtenir le nombre de commentaires.

Si vous initialisez à zéro @posts.sum(&:comment_count) sera, mais si vous ne le faites pas, il pourrait ne pas, car il échouera sur zéro.

Je recommande la définition de votre colonne comme ceci:

add_column :posts, :comments_count, :integer, :default => 0, :null => false

1

Rails envoyer simplement le SQL

UPDATE posts SET comment_count = comment_count + 1, WHERE id IN (10, 15) 

suivant Donc, soit le DB sait que non défini +1 == 1 ou Rails fait un peu d'initialisation propre. Dans les deux cas, cela me semble un comportement stable, ne les mettez donc pas à zéro et enregistrez le travail. Puisque vous ne serez pas en mesure de voir si vous avez fait l'initialisation de toute façon (cela fonctionne tout de même sans) comment allez-vous le tester. Et s'il n'est pas garanti d'être initialisé par vous, qu'est-ce que vous avez vraiment gagné en termes de preuve d'avenir.