3

我正在使用 rspec 进行测试,并使用 hornsby 场景用于测试中使用的对象图。

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

4

2 回答 2

8

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

假设您有一个帖子对象数组,并且您想获得评论数量的总和。

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

我建议像这样定义您的列:

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

于 2009-11-24T18:52:01.547 回答
1

Rails 只需发送以下 SQL

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

所以要么数据库知道 undefined +1 == 1 要么 Rails 自己做一些初始化。在任何一种情况下,这对我来说都是稳定的行为,所以不要将它们设置为零并保存工作。由于无论如何您都无法查看是否进行了初始化(它的工作原理相同),您将如何测试它。如果它不能保证由您初始化,那么您在未来的校对方面真正获得了什么。

于 2009-09-21T08:14:31.330 回答