Fix cached posts including stale stats (#26409)
This commit is contained in:
parent
3ed2bf92d0
commit
60b9fa641d
2 changed files with 34 additions and 2 deletions
|
@ -367,13 +367,25 @@ class Status < ApplicationRecord
|
||||||
|
|
||||||
account_ids.uniq!
|
account_ids.uniq!
|
||||||
|
|
||||||
|
status_ids = cached_items.map { |item| item.reblog? ? item.reblog_of_id : item.id }.uniq
|
||||||
|
|
||||||
return if account_ids.empty?
|
return if account_ids.empty?
|
||||||
|
|
||||||
accounts = Account.where(id: account_ids).includes(:account_stat, :user).index_by(&:id)
|
accounts = Account.where(id: account_ids).includes(:account_stat, :user).index_by(&:id)
|
||||||
|
|
||||||
|
status_stats = StatusStat.where(status_id: status_ids).index_by(&:status_id)
|
||||||
|
|
||||||
cached_items.each do |item|
|
cached_items.each do |item|
|
||||||
item.account = accounts[item.account_id]
|
item.account = accounts[item.account_id]
|
||||||
item.reblog.account = accounts[item.reblog.account_id] if item.reblog?
|
item.reblog.account = accounts[item.reblog.account_id] if item.reblog?
|
||||||
|
|
||||||
|
if item.reblog?
|
||||||
|
status_stat = status_stats[item.reblog.id]
|
||||||
|
item.reblog.status_stat = status_stat if status_stat.present?
|
||||||
|
else
|
||||||
|
status_stat = status_stats[item.id]
|
||||||
|
item.status_stat = status_stat if status_stat.present?
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -13,12 +13,17 @@ RSpec.describe CacheConcern do
|
||||||
def empty_relation
|
def empty_relation
|
||||||
render plain: cache_collection(Status.none, Status).size
|
render plain: cache_collection(Status.none, Status).size
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def account_statuses_favourites
|
||||||
|
render plain: cache_collection(Status.where(account_id: params[:id]), Status).map(&:favourites_count)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
before do
|
before do
|
||||||
routes.draw do
|
routes.draw do
|
||||||
get 'empty_array' => 'anonymous#empty_array'
|
get 'empty_array' => 'anonymous#empty_array'
|
||||||
post 'empty_relation' => 'anonymous#empty_relation'
|
get 'empty_relation' => 'anonymous#empty_relation'
|
||||||
|
get 'account_statuses_favourites' => 'anonymous#account_statuses_favourites'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -36,5 +41,20 @@ RSpec.describe CacheConcern do
|
||||||
expect(response.body).to eq '0'
|
expect(response.body).to eq '0'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'when given a collection of statuses' do
|
||||||
|
let!(:account) { Fabricate(:account) }
|
||||||
|
let!(:status) { Fabricate(:status, account: account) }
|
||||||
|
|
||||||
|
it 'correctly updates with new interactions' do
|
||||||
|
get :account_statuses_favourites, params: { id: account.id }
|
||||||
|
expect(response.body).to eq '[0]'
|
||||||
|
|
||||||
|
FavouriteService.new.call(account, status)
|
||||||
|
|
||||||
|
get :account_statuses_favourites, params: { id: account.id }
|
||||||
|
expect(response.body).to eq '[1]'
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue