Rails模型counter_cache列初始化

时间:2009-09-21 07:26:50

标签: ruby-on-rails counter-cache

我正在使用rspec进行测试中使用的对象图的测试和角色场景。

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

2 个答案:

答案 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会对它自己做一些初始化。 无论哪种情况,这对我来说都是稳定的行为,所以不要将它们设置为零并保存工作。既然你无法看到你是否进行了初始化(它没有相同的工作原理)你将如何测试它。如果不能保证由你初始化你在未来的证明方面真正获得了什么。