Belongs_to :counter_cache
Илья • 24 апреля 2007 г.
Как всё-таки иногда полезно почитать чужой код. Особенно, если его писал Рик Олсен ;)
Ковыряясь в Beast, наткнулся на интересную штуку, которую раньше не замечал:
class Topic < ActiveRecord::Base
belongs_to :forum, :counter_cache => true
…
Флаг counter_cache сделан для автоматического сохранения в базе количество ассоциированных объектов. Будет их автоматически наращивать и уменьшать при добавлении и удалении соответственно.
Для того чтобы вся эта красота работала, в таблице бд модели нужно добавить поле с именем типа «#{table_name}_count». Или, если вы хотите собственное название, достаточно просто его прописать вместо true:
class Topic < ActiveRecord::Base
belongs_to :forum, :counter_cache => :super_puper_counter
…
Делается это всё для быстроты. Чтобы каждый раз, когда вам нужно узнать сколько у форумов топиков (к примеру), вам не нужно было бы делать SQL-запрос, считая все топики.
Как приятно узнать что-то новое.
Update: добавил информацию о том, как нужно назвать поле в базе данных
5 комментариев:
Извините, но комментарии для этой статьи уже закрыты.

А как поле называется, а то спать охота уже и в апи лазать не тянет))
:counter_cache – caches the number of belonging objects on the associate class through use of increment_counter and decrement_counter. The counter cache is incremented when an object of this class is created and decremented when it‘s destroyed. This requires that a column named ”#{table_name}_count” (such as comments_count for a belonging Comment class) is used on the associate class (such as a Post class). You can also specify a custom counter cache column by given that name instead of a true/false value to this option (e.g., :counter_cache => :my_custom_counter.)
http://railscasts.com/episodes/23
Спасибо. Очень хорошо что обьяснили для чего это нужно, а то я начинающий в веб программинге на руби =) буду рад если в будущем будете так же описывать так.
Beast, кстати, криво считает количество тем… однажды в форуме оказалось -2 ветки :(