Rails Models counter_cache Инициализация столбца - PullRequest
3 голосов
/ 21 сентября 2009

Я использую rspec для тестирования и сценарии Хорнсби для графов объектов, используемых в тестах.

Рекомендуется ли инициализировать столбцы кэша счетчика значением 0, а не оставлять их неинициализированными (ноль)? Или я должен определить значение по умолчанию в миграциях, которые создают эти столбцы кэша счетчика?

Ответы [ 2 ]

8 голосов
/ 24 ноября 2009

Да, вы должны установить значение по умолчанию. В противном случае вам придется использовать специальные математические операции для обработки значений NULL.

Допустим, у вас есть массив объектов записей и вы хотите получить сумму количества комментариев.

Если вы инициализируете в ноль, то @posts.sum(&:comment_count) будет, но если вы этого не сделаете, это может произойти не потому, что он потерпит неудачу на нуле.

Я рекомендую определить вашу колонку следующим образом:

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

1 голос
/ 21 сентября 2009

Rails просто отправляет следующий SQL

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

Так что либо БД знает, что undefined +1 == 1, либо Rails выполняет свою собственную инициализацию. В любом случае это кажется стабильным поведением, поэтому не устанавливайте их на ноль и сохраняйте работу. Поскольку вы не сможете увидеть, выполнили ли вы инициализацию в любом случае (она работает точно так же и без), как вы будете ее тестировать. И если не гарантируется, что вы инициализируете то, что вы действительно получили в плане проверки на будущее.

...