5

Unknown key(s): counter_cacheRoRアプリにカウンターキャッシュ列を実装しようとするとエラーが発生します。

この質問でモデルの関連付けを実装しました:モデルの関連付けの質問

これが私の移行です:

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 に答える 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 )

UPD 1

:counter_cache => trueVideoVoteクラスに参加する必要があります。

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 に答える