Ruby on Rails Counter Cache
-
27-10-2019 - |
Вопрос
Я получаю ошибку 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
в видео модель после belongs_to :video
. Анкет Однако, когда я это делаю, я получаю ошибку:
wrong number of arguments (2 for 1)
Что я делаю не так?
Решение
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
Другие советы
Чтобы сделать Contre_caching, сначала необходимо запустить миграцию, которая заполняет столбцы счета, прежде чем вы включите оператор Counter_Cache в модель. Оказавшись в модели, столбцы читаются только.
Чтобы избежать ошибок только для чтения при выполнении этой миграции, вы должны использовать Reset_counters:
Video.find_each do |video|
Video.reset_counters video.id, :video_votes
end
Переписывание решения Радживе Джайна:
Удалять :counter_cache => true
оператор из файла модели.
Повторить миграцию: rake db:migrate
Добавьте оператор counter_cache в свою модель: :counter_cache => true