Ruby on Rails 计数器缓存错误

发布于 2024-10-24 18:15:02 字数 976 浏览 2 评论 0原文

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

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

这是我的迁移:

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 之后进入 VideoVote 模型。但是,当我这样做时,我收到错误:

参数数量错误(2 为 1)

我做错了什么?

I get the error Unknown key(s): counter_cache when trying to implement a counter cache column in my RoR app.

I implemented the model associations in this question: Model association question

Here's my migration:

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

However, after watching http://media.railscasts.com/videos/023_counter_cache_column.mov I thought that maybe I had to move :counter_cache => true into the VideoVote model after belongs_to :video. However, when I do that, I get the error:

wrong number of arguments (2 for 1)

What am I doing wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

年少掌心 2024-10-31 18:15:02

update_attribute 不是 update_attributeS

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

update_attribute not update_attribteS

p.update_attribute :videos_votes_count, p.video_votes.length

or with update_attributes:

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

UPD 1

:counter_cache => true should be at the VideoVote class:

class VideoVote < ActiveRecord::Base
  belongs_to :user
  belongs_to :video, :counter_cache => true
end
八巷 2024-10-31 18:15:02

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

To do counter_caching,you need to run the migration first that fills in the count columns BEFORE you include the counter_cache statement in the model. Once in the model, the columns are read only.

圈圈圆圆圈圈 2024-10-31 18:15:02

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

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

To avoid read-only errors while running this migration, you should use reset_counters:

Video.find_each do |video|
  Video.reset_counters video.id, :video_votes
end
ヤ经典坏疍 2024-10-31 18:15:02

重写 Rajive Jain 的解决方案:

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

重新运行迁移:rake db:migrate

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

Rewriting Rajive Jain's solution :

Remove :counter_cache => true statement from the model file.

Rerun the migration : rake db:migrate

Add the counter_cache statement in your model : :counter_cache => true

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文