2010-03-19 13 views
6

Sto cercando di ottenere la funzionalità cache contatore di rails ma non riesco a coglierla completamente.Rails Counter Cache e la sua implementazione

Diciamo che abbiamo 3 modelli

A B C

A appartiene a B o C a seconda un key_type campo e key_id. key_type dice se A appartiene a B o C quindi se key_type = "B", quindi il record appartiene a B altrimenti appartiene a C.

Nel mio modello a.rb, ho definito seguenti associazioni:

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

e

in B e C file modello

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

Sia B e C modelli hanno una colonna come as_count

Il problema è ogni volta che un oggetto di un conteggio viene incrementato in entrambi i modelli be c.

Qualsiasi aiuto è apprezzato. Inizialmente pensavo che questo potesse funzionare:

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"} 

Ma questo non aiuta.

Grazie

+0

Questo non dovrebbe essere contrassegnato con "graal". – Fletch

risposta

15

Sembra che le associazioni polimorfiche siano la soluzione per il problema.

Immagina di avere un modello di commento e 2 modelli che possono essere commentati: post e profilo.

Nei modelli postali e Profilo:

has_many :comments, :as => :resource 

Nel modello Commento:

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

Non dimenticate di aggiungere la colonna "comments_count" sia il profilo e modelli postali e voilà!

+0

Funziona solo quando si aggiungono commenti. Il numero di commenti aumenta ma quando un commento viene eliminato non aggiornerà il numero di commenti. qualche idea del perché questo potrebbe accadere? qualsiasi soluzione possibile? Grazie. –

+0

sembra che ci sia un bug con counter_cache e relazioni polimorfiche nelle rotaie <5.0. Vedi https://github.com/rails/rails/issues/16407 – John

Problemi correlati