2012-02-22 22 views
5

Sto lavorando per aggiungere un counter_cache ai miei modelli:È possibile utilizzare una counter_cache con has_many?

Utenti (id, ORG_ID) org (id, USERS_COUNT)

Ma il seguente errore: ArgumentError (Unknown key(s): counter_cache):

class Org < ActiveRecord::Base 
    has_many :users, :counter_cache => true 

class User < ActiveRecord::Base 
    belongs_to :org 

Qualsiasi idee su cosa è impostato sbagliato. Vorrei che Org.users_count restituisse la counter_cache per il numero di utenti di quell'org?

risposta

14

Non funziona in questo modo. Dovete spostare la counter_cache al belongs_to:

class User < ActiveRecord::Base 
    belongs_to :org, :counter_cache => true 
end 

E aggiungere un campo users_count al modello Org e quindi Rails sarà aggiornare il campo per voi. Non dimenticare di aggiungere uno :default=> 0 nella migrazione, altrimenti non funzionerà correttamente.

Se si dispone già di alcuni dati nella vostra app e si desidera sincronizzare il contatore, è possibile eseguire (dopo la migrazione) qualcosa di simile al seguente:

Org.find(:all).each do |o| 
    Org.update_counters o.id, :users_count => o.users.count 
    end 
+0

Grazie, che sembra aver aiutato. Qual è il modo migliore per attivare un ripristino per i record esistenti? Posso eseguirlo come attività rake dato che ho già eseguito la migrazione? – AnApprentice

+1

Ho modificato la domanda. È possibile eseguire quel codice con 'rails runner' – lucapette

+1

@AnApprentice se la risposta ha risolto il problema, contrassegnarlo come accettato;) – lucapette

Problemi correlati