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