Вы можете реализовать счетчик кэша для этой цели. Я веду счетчик на модели альбомов, который отслеживает, сколько фотографий связано с ней. Мой процесс выглядит примерно так (мне кажется, я где-то нашел этот метод в блоге, поэтому я не возражаю против оригинального кода):
На фотографии фотографии:
after_save :update_counter_caches
after_destroy :update_counter_caches
def update_counter_caches
self.albums.each { |a| a.update_count } unless self.albums.empty?
end
На модели "Альбомы":
def update_count
update_attribute(:photographs_count, self.photographs.length)
end
Миграция, необходимая для альбомов:
class AddCounterCacheColumnToModels < ActiveRecord::Migration
def self.up
add_column :albums, :photographs_count, :integer, :default => 0
end
def self.down
remove_column :albums, :photographs_count
end
end
Если я не понял вашего вопроса, это должен быть довольно аккуратный способ достижения того, чего вы хотите. Это хорошо работает в моем текущем проекте. :)
РЕДАКТИРОВАТЬ: Как примечание, причина, по которой я использую эту настройку, а не метод по умолчанию: counter_cache, заключается в том, что мне нужно поддерживать несколько счетчиков для нескольких ассоциаций в одной модели. Насколько я знаю, вы не можете достичь этого с помощью: counter_cache.