Со временем количество записей в вашем проэкте вырастет настолько что считать счетчики, например комментариев или кол-ва тегов к записи станет чрезмерно долгим процесом и вам захочется закешировать этот показатель.
К счастью во фреймфорке уже есть такая функциональность, и она называется counter_cache
Для использования вам нужно в вашу ассоциацию добавить такое ключ/значение
:counter_cache => true
Например для модели Comment, который принадлежит модели Post это будет выглядеть так:
class Comment < ActiveRecord::Base belongs_to :post, :counter_cache => true end
Создаем колонку через миграцию:
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
0 коментариев