2012-02-22 13 views
5

pracuję dodać counter_cache do moich modeli:Czy można użyć counter_cache z has_many?

Użytkownicy (id, org_id) organizacjach (id, USERS_COUNT)

Ale pojawia się następujący błąd: ArgumentError (Unknown key(s): counter_cache):

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

class User < ActiveRecord::Base 
    belongs_to :org 

Wszelkie pomysły, co jest źle skonfigurowane. Chciałbym, żeby Org.users_count zwrócił counter_cache dla # użytkowników w tym org?

Odpowiedz

14

To nie działa w ten sposób. Trzeba przesunąć counter_cache do belongs_to:

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

I dodać pole users_count do modelu Org a następnie Szyny zaktualizuje pola dla Ciebie. Nie zapomnij dodać do migracji wartości :default=> 0, w przeciwnym razie nie będzie działać poprawnie.

Jeśli masz już jakieś dane w aplikacji i chcesz zsynchronizować licznik, można uruchomić (po migracji) coś jak poniżej:

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

Dziękuję, że wydaje się, że pomogło. Jaki jest najlepszy sposób wyzerowania istniejących rekordów? Czy mogę uruchomić go jako zadanie rake, biorąc pod uwagę, że już uruchomiłem migrację? – AnApprentice

+1

Edytowałem pytanie. Możesz uruchomić ten kod za pomocą 'rails runner' – lucapette

+1

@AnApprentice, jeśli odpowiedź rozwiązała Twój problem, oznacz go jako zaakceptowany;) – lucapette

Powiązane problemy