代码之家  ›  专栏  ›  技术社区  ›  Eimantas

Rails模型计数器缓存列初始化

  •  3
  • Eimantas  · 技术社区  · 16 年前

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

    将计数器缓存列初始化为0值而不是不进行初始化(nil),这是一个好的实践吗?还是应该在创建那些计数器缓存列的迁移中定义默认值?

    2 回复  |  直到 16 年前
        1
  •  8
  •   Luke Francl    16 年前

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

    假设您有一个post对象数组,并且想要得到注释的总数。

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

    我建议这样定义您的列:

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

        2
  •  1
  •   nasmorn    16 年前

    Rails只发送以下SQL

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

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