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 комментариев:

  1. Konstantin Tumalevich:

    А как поле называется, а то спать охота уже и в апи лазать не тянет))

  2. ega:

    :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.)

  3. que:

    http://railscasts.com/episodes/23

  4. BadMinus:

    Спасибо. Очень хорошо что обьяснили для чего это нужно, а то я начинающий в веб программинге на руби =) буду рад если в будущем будете так же описывать так.

  5. antono:

    Beast, кстати, криво считает количество тем… однажды в форуме оказалось -2 ветки :(

Извините, но комментарии для этой статьи уже закрыты.