5

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 => truebelongs_to :video. 但是,当我这样做时,我得到了错误:

wrong number of arguments (2 for 1)

我究竟做错了什么?

4

4 回答 4

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 )

更新 1

:counter_cache => true应该在 VideoVote 类:

class VideoVote < ActiveRecord::Base
  belongs_to :user
  belongs_to :video, :counter_cache => true
end
于 2011-03-17T19:22:15.357 回答
3

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

于 2011-04-27T23:03:39.303 回答
2

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

Video.find_each do |video|
  Video.reset_counters video.id, :video_votes
end
于 2012-08-07T05:35:33.610 回答
0

重写 Rajive Jain 的解决方案:

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

重新运行迁移:rake db:migrate

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

于 2012-07-27T19:33:07.677 回答