Ruby on Rails计数器缓存错误

时间:2011-03-17 19:12:55

标签: ruby-on-rails ruby ruby-on-rails-3 associations counter-cache

尝试在我的RoR应用中实现计数器缓存列时,我收到错误Unknown key(s): counter_cache

我在这个问题中实现了模型关联:Model association question

这是我的迁移:

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之后将belongs_to :video移动到VideoVote模型中。但是,当我这样做时,我收到错误:

wrong number of arguments (2 for 1)

我做错了什么?

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

要执行counter_caching,您需要首先运行迁移,在模型中包含counter_cache语句之前填充计数列。进入模型后,列是只读的。

答案 2 :(得分:2)

为避免在运行此迁移时出现只读错误,您应该使用reset_counters:

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

答案 3 :(得分:0)

重写Rajive Jain的解决方案:

从模型文件中删除:counter_cache => true语句。

重新运行迁移:rake db:migrate

在模型中添加counter_cache语句::counter_cache => true