Мне нужно добавить кэш-счетчик к базе данных, содержащей около 4 миллионов строк. Обычный способ, который я сделал бы это, заключается в миграции следующим образом:Обновление кэша счетчика Postgres с чистым SQL
class AddClicksCounterCacheToPosts < ActiveRecord::Migration
def change
add_column :posts, :clicks_count, :integer
Post.find_each { |post| Post.reset_counters(post.id, :clicks) }
end
end
Однако это слишком медленно. I came across a way, чтобы сделать это в чистом SQL, но похоже, что он был написан для MySQL, и я не могу заставить его работать для Postgres. Вот что я пытаюсь:
class AddClicksCounterCacheToPosts < ActiveRecord::Migration
def change
add_column :posts, :clicks_count, :integer
execute <<-eos
update posts, (select
id as post_id, coalesce(count, 0) as count
from posts left join
(select post_id, count(id) as count from clicks group by post_id) as count_table
on
posts.id = count_table.post_id) as count_table
set
posts.clicks_count = count_table.count
where
posts.id = count_table.post_id
eos
end
end
И это ошибка я получаю:
ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR: syntax error at or near ","
Я уверен, что запятые разрешено в Postgres, но если честно, я не пишу слишком много сырой postgres, поэтому я не уверен.
Любая идея как конвертировать это в Postgres?
Кажется, вы заменили запрос на новый в течение льготного периода. –