diff options
author | Eugen Rochko <eugen@zeonfederated.com> | 2018-05-03 10:41:58 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-05-03 10:41:58 +0200 |
commit | a5293fdf619b0be32a420c36a73e7ecfbe6d27cd (patch) | |
tree | 88dca473e89c1b2201c12e0a8a9d495a338f8712 /app/models/concerns/status_threading_concern.rb | |
parent | a3d84e705a6e19ebbc240604de62c3ef8531ddf9 (diff) |
Fix n+1 queries in StatusThreadingConcern (#7321)
Diffstat (limited to 'app/models/concerns/status_threading_concern.rb')
-rw-r--r-- | app/models/concerns/status_threading_concern.rb | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/app/models/concerns/status_threading_concern.rb b/app/models/concerns/status_threading_concern.rb index a3fd34e94..8e817be00 100644 --- a/app/models/concerns/status_threading_concern.rb +++ b/app/models/concerns/status_threading_concern.rb @@ -71,10 +71,21 @@ module StatusThreadingConcern end def find_statuses_from_tree_path(ids, account) - statuses = statuses_with_accounts(ids).to_a + statuses = statuses_with_accounts(ids).to_a + account_ids = statuses.map(&:account_id).uniq + domains = statuses.map(&:account_domain).compact.uniq - # FIXME: n+1 bonanza - statuses.reject! { |status| filter_from_context?(status, account) } + relations = if account.present? + { + blocking: Account.blocking_map(account_ids, account.id), + blocked_by: Account.blocked_by_map(account_ids, account.id), + muting: Account.muting_map(account_ids, account.id), + following: Account.following_map(account_ids, account.id), + domain_blocking_by_domain: Account.domain_blocking_map_by_domain(domains, account.id), + } + end + + statuses.reject! { |status| filter_from_context?(status, account, relations) } # Order ancestors/descendants by tree path statuses.sort_by! { |status| ids.index(status.id) } @@ -84,7 +95,7 @@ module StatusThreadingConcern Status.where(id: ids).includes(:account) end - def filter_from_context?(status, account) - StatusFilter.new(status, account).filtered? + def filter_from_context?(status, account, relations) + StatusFilter.new(status, account, relations).filtered? end end |