5

Recibo el error Unknown key(s): counter_cache al intentar implementar una columna de caché de contador en mi aplicación RoR.Error de caché del contador de Ruby on Rails

que implementan las asociaciones de modelos en esta pregunta: Model association question

Aquí es mi migración:

class AddVideoVotesCountToVideos < ActiveRecord::Migration 
    def self.up 
    add_column :videos, :video_votes_count, :integer, :default => 0 

    Video.reset_column_information 
    Video.find(:all).each do |p| 
     p.update_attributes :videos_votes_count, p.video_votes.length 
    end 
    end 

    def self.down 
    remove_column :videos, :video_votes_count 
    end 
end 

Sin embargo, después de ver http://media.railscasts.com/videos/023_counter_cache_column.mov pensé que tal vez tuviera que mover :counter_cache => true en el modelo VideoVote después belongs_to :video. Sin embargo, cuando lo hago, me sale el error:

wrong number of arguments (2 for 1)

¿Qué estoy haciendo mal?

Respuesta

4

update_attribute no update_attribteS

p.update_attribute :videos_votes_count, p.video_votes.length 

o con update_attributes:

p.update_attributes(:video_votes_count => p.video_votes.length) 

UPD 1

:counter_cache => true debe estar en la clase VideoVote:

class VideoVote < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :video, :counter_cache => true 
end 
+0

aún así obtener el primer error ... ¿dónde debería ': counter_cache => true' ir? –

+0

respuesta se actualiza – fl00r

+0

bien, ahora me sale este error: 'método no definido '' para videos_votes_count = # ' –

3

Para hacer counter_caching, primero debe ejecutar la migración que completa las columnas de conteo ANTES de incluir la instrucción counter_cache en el modelo. Una vez en el modelo, las columnas son de solo lectura.

0

Reescribiendo la solución de Rajive Jain:

Retire :counter_cache => true declaración del archivo de modelo.

Vuelva a ejecutar la migración: rake db:migrate

agregar la instrucción counter_cache en su modelo: :counter_cache => true

2

Para evitar sólo lectura errores durante la ejecución de esta migración, se debe utilizar reset_counters:

Video.find_each do |video| 
    Video.reset_counters video.id, :video_votes 
end 
+0

El segundo argumento para el método 'reset_counters' debe ser el nombre de la asociación, no el nombre del columna counter_cache, por lo que debería ser: 'Video.reset_counters video.id,: video_votes' –

+0

Gracias @AndreaSingh! Actualizado. – stereoscott

+0

'reset_counters' ahora está en desuso – ahnbizcad