2012-02-22 20 views
5

estoy trabajando para añadir un counter_cache a mis modelos:¿Se puede usar counter_cache con has_many?

Usuarios (id, ORG_ID) Org (id, USERS_COUNT)

Pero el siguiente error: ArgumentError (Unknown key(s): counter_cache):

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

class User < ActiveRecord::Base 
    belongs_to :org 

Cualquier ideas de lo que está mal configurado. Me gustaría que Org.users_count devuelva counter_cache para el # de usuarios en esa organización.

Respuesta

14

No funciona de esta manera. Usted tiene que mover el counter_cache a la belongs_to:

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

y agregue un campo users_count al modelo Org y luego rieles se actualizará el campo para usted. No se olvide de agregar un :default=> 0 en la migración, de lo contrario no funcionará bien.

Si usted tiene ya algunos datos en su aplicación y que desea sincronizar el contador, puede ejecutar (después de la migración) algo como lo siguiente:

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

Gracias, que parece haber ayudado. ¿Cuál es la mejor manera de desencadenar un restablecimiento de los registros existentes? ¿Puedo ejecutarlo como una tarea de rake dado que ya he ejecutado la migración? – AnApprentice

+1

He editado la pregunta. Puede ejecutar ese código con 'rails runner' – lucapette

+1

@AnApprentice si la respuesta resolvió su problema, por favor, márquelo como aceptado;) – lucapette

Cuestiones relacionadas