我正在使用rspec进行测试中使用的对象图的测试和角色场景。
将计数器缓存列初始化为0值而不是将它们保持为未初始化(nil)是一种好习惯吗?或者我应该在创建这些计数器缓存列的迁移中定义默认值吗?
答案 0 :(得分:8)
是的,您应该设置默认值。否则,您必须使用特殊情况数学运算来处理NULL。
假设你有一系列帖子对象,你想得到评论数量的总和。
如果您将初始化为零@posts.sum(&:comment_count)
,但如果不这样做,则可能不会因为它将在nil上失败。
我建议您按照以下方式定义列:
add_column :posts, :comments_count, :integer, :default => 0, :null => false
答案 1 :(得分:1)
Rails只发送以下SQL
UPDATE posts SET comment_count = comment_count + 1, WHERE id IN (10, 15)
因此,DB要么知道undefined +1 == 1,要么Rails会对它自己做一些初始化。 无论哪种情况,这对我来说都是稳定的行为,所以不要将它们设置为零并保存工作。既然你无法看到你是否进行了初始化(它没有相同的工作原理)你将如何测试它。如果不能保证由你初始化你在未来的证明方面真正获得了什么。