2009-09-21 95 views
3

我使用rspec进行测试,并在测试中使用对象图的hornsby场景。Rails模型counter_cache列初始化

将计数器缓存列初始化为0值而不是将它们保留为未初始化(nil)是否是一种好的做法?或者,我应该在创建这些计数器缓存列的迁移中定义默认值?

回答

8

是的,你应该设置默认值。否则,你必须特殊的数学运算来处理NULL。

比方说,你有一个后期对象数组,你想得到的总和评论数。

如果初始化为零@posts.sum(&:comment_count)会,但如果不这样做可能不会,因为它会在零上失败。

我建议定义你这样的柱:

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

1

的Rails只需发送以下SQL

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

要不就是DB知道未定义+1 == 1或Rails会一些它自己的初始化。 在这两种情况下,对我来说这似乎都很稳定,所以不要将它们设置为零并保存工作。由于无论如何您都无法看到是否进行了初始化(它的工作原理完全相同),您将如何测试它。如果不能保证你初始化你在未来打样方面真的获得了什么。