Виталий Янчук - Домашняя страница
Логин: Twitter Facebook
Тэги:
Rails

Блог о Ruby on Rails Rss-small


Со временем количество записей в вашем проэкте вырастет настолько что считать счетчики, например комментариев или кол-ва тегов к записи станет чрезмерно долгим процесом и вам захочется закешировать этот показатель.

К счастью во фреймфорке уже есть такая функциональность, и она называется counter_cache

Для использования вам нужно в вашу ассоциацию добавить такое ключ/значение

:counter_cache => true

Например для модели Comment, который принадлежит модели Post это будет выглядеть так:

class Comment < ActiveRecord::Base
  belongs_to :post, :counter_cache => true
end

Создать колонку для записи этого числа в таблицу, следуя идеи convension over configuration, стандартное значение этой колонки будет comments_count

Создаем колонку через миграцию:

class AddCommentsCountToPosts < ActiveRecord::Migration
  def self.up
    add_column :posts, :comments_count, :integer
  end

  def self.down
    remove_column :posts, :comments_count
  end
end

Кстати чтобы задать конкретно имя колонки, вместо дефолтного, достаточно написать её имя вместо true в ключе :counter_cache:

...
  :counter_cache => :comments_number

Таким образом при создании коментария к посту, фреймфорк будет выполнять запрос:

UPDATE `posts` SET `comments_count` = COALESCE(`comments_count`, 0) + 1 WHERE `posts`.`id` = 41

Есть небольшой нюанс с использованием counter cache в ассоциации has_many throught.

Ключ counter_cache доступен только для ассоциации belongs_to, поэтому кеш нужно включать в связывающей таблице:

# models/post.rb
class Post < ActiveRecord::Base
  has_many :tags, :through => :taggings
end

# models/tag.rb
class Tag < ActiveRecord::Base
   has_many :posts, :through => :taggings
end

# models/tagging.rb
class Tagging < ActiveRecord::Base
  belongs_to :post, :counter_cache => :tags_count
  belongs_to :tag
end

Теги: rails, rails3, counter_cache

0 коментариев

Чтобы оставить комментарий, пожалуйста представьтесь нажав на одну из кнопок ниже