Skip to content
Snippets Groups Projects
Commit fd81916e authored by Keiji Yoshimi's avatar Keiji Yoshimi
Browse files

cache blockings for reducing queries.

parent 8a58942c
No related branches found
No related tags found
No related merge requests found
......@@ -7,4 +7,12 @@ class Block < ApplicationRecord
belongs_to :target_account, class_name: 'Account', required: true
validates :account_id, uniqueness: { scope: :target_account_id }
after_create :remove_blocking_cache
after_destroy :remove_blocking_cache
def remove_blocking_cache
Rails.cache.delete("blocked_account_ids:#{account_id}")
Rails.cache.delete("blocked_account_ids:#{target_account_id}")
end
end
......@@ -8,4 +8,11 @@ class Mute < ApplicationRecord
validates :account, :target_account, presence: true
validates :account_id, uniqueness: { scope: :target_account_id }
after_create :remove_blocking_cache
after_destroy :remove_blocking_cache
def remove_blocking_cache
Rails.cache.delete("blocked_account_ids:#{account_id}")
end
end
......@@ -180,7 +180,9 @@ class Status < ApplicationRecord
private
def filter_timeline(query, account)
blocked = Block.where(account: account).pluck(:target_account_id) + Block.where(target_account: account).pluck(:account_id) + Mute.where(account: account).pluck(:target_account_id)
blocked = Rails.cache.fetch("blocked_account_ids:#{account.id}") do
Block.where(account: account).pluck(:target_account_id) + Block.where(target_account: account).pluck(:account_id) + Mute.where(account: account).pluck(:target_account_id)
end
query = query.where('statuses.account_id NOT IN (?)', blocked) unless blocked.empty? # Only give us statuses from people we haven't blocked, or muted, or that have blocked us
query = query.where('accounts.silenced = TRUE') if account.silenced? # and if we're hellbanned, only people who are also hellbanned
query
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment