Rails Counter Cache и его реализация - PullRequest
6 голосов
/ 19 марта 2010

Я пытаюсь заполучить функцию кэширования счетчика рельсов, но не могу понять ее полностью.

Допустим, у нас есть 3 модели

A B C

A принадлежит B или C в зависимости от поля key_type и key_id. key_type сообщает, принадлежит ли A B или C, поэтому, если key_type = "B", запись принадлежит B, в противном случае она принадлежит C.

В моей модели a.rb я определил следующие ассоциации:

belongs_to :b, :counter_cache => true, :foreign_key => "key_id"
belongs_to :c, :counter_cache => true, :foreign_key => "key_id"

и

в файлах моделей b и c

has_many :as , :conditions => {:key_type => "B"}
has_many :as , :conditions => {:key_type => "C"}

Модели B и C имеют столбец as_count

Проблема в том, что каждый раз, когда создается объект, количество увеличивается в обеих моделях b и C.

Любая помощь приветствуется. Первоначально я думал, что это может работать:

belongs_to :b, :counter_cache => true, :foreign_key => "key_id", :conditions => {:key_type => "B"}
belongs_to :c, :counter_cache => true, :foreign_key => "key_id", :conditions => {:key_type => "C"}

Но это не помогает.

Спасибо

Ответы [ 2 ]

15 голосов
/ 19 марта 2010

Похоже, что полиморфные ассоциации - это способ решить вашу проблему.

Представьте, что у вас есть модель комментариев и 2 модели, которые можно комментировать: сообщение и профиль.

В моделях сообщений и профилей:

has_many :comments, :as => :resource

В комментарии модель:

belongs_to :resource, :polymorphic => true, :counter_cache => true

Не забудьте добавить столбец "comments_count" в моделях профиля и поста и вуаля!

4 голосов
/ 27 марта 2011
...