Ошибка кэша счетчика Ruby on Rails - PullRequest
5 голосов
/ 17 марта 2011

Я получаю сообщение об ошибке Unknown key(s): counter_cache при попытке реализовать столбец кэша счетчика в моем приложении RoR.

Я реализовал ассоциации моделей в этом вопросе: Вопрос ассоциации моделей

Вот моя миграция:

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

Однако после просмотра http://media.railscasts.com/videos/023_counter_cache_column.mov я подумал, что, возможно, мне пришлось переместиться :counter_cache => true в модель VideoVote после belongs_to :video. Однако, когда я это делаю, я получаю сообщение об ошибке:

wrong number of arguments (2 for 1)

Что я делаю не так?

Ответы [ 4 ]

4 голосов
/ 17 марта 2011

update_attribute не update_attribteS

p.update_attribute :videos_votes_count, p.video_votes.length

или update_attributes:

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

UPD 1

:counter_cache => true должно быть в классе VideoVote:

class VideoVote < ActiveRecord::Base
  belongs_to :user
  belongs_to :video, :counter_cache => true
end
3 голосов
/ 28 апреля 2011

Чтобы выполнить counter_caching, сначала нужно запустить миграцию, которая заполняет столбцы count ДО ТОГО, как вы включите в модель выражение counter_cache.Попав в модель, столбцы доступны только для чтения.

2 голосов
/ 07 августа 2012

Чтобы избежать ошибок только для чтения при выполнении этой миграции, вы должны использовать reset_counters:

Video.find_each do |video|
  Video.reset_counters video.id, :video_votes
end
0 голосов
/ 27 июля 2012

Переписывание решения Раджива Джайна:

Удалить оператор :counter_cache => true из файла модели.

Перезапустите миграцию: rake db:migrate

Добавьте оператор counter_cache в вашу модель: :counter_cache => true

...