From 54d4e5252be8cd9fa780df46e06541da8263d368 Mon Sep 17 00:00:00 2001 From: ThibG Date: Tue, 12 Jan 2021 09:27:38 +0100 Subject: [PATCH] Use Rails' index_by where it makes sense (#15542) * Use Rails' index_by where it makes sense * Fix tests Co-authored-by: Claire --- app/controllers/api/v1/markers_controller.rb | 2 +- app/controllers/concerns/cache_concern.rb | 2 +- app/lib/entity_cache.rb | 2 +- app/lib/settings/scoped_settings.rb | 2 +- app/lib/webfinger.rb | 2 +- app/models/account.rb | 2 +- app/models/notification.rb | 2 +- app/models/setting.rb | 2 +- app/models/status.rb | 2 +- app/models/trending_tags.rb | 2 +- lib/mastodon/media_cli.rb | 2 +- spec/models/notification_spec.rb | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/controllers/api/v1/markers_controller.rb b/app/controllers/api/v1/markers_controller.rb index 28c2ec79168..867e6facf45 100644 --- a/app/controllers/api/v1/markers_controller.rb +++ b/app/controllers/api/v1/markers_controller.rb @@ -7,7 +7,7 @@ class Api::V1::MarkersController < Api::BaseController before_action :require_user! def index - @markers = current_user.markers.where(timeline: Array(params[:timeline])).each_with_object({}) { |marker, h| h[marker.timeline] = marker } + @markers = current_user.markers.where(timeline: Array(params[:timeline])).index_by(&:timeline) render json: serialize_map(@markers) end diff --git a/app/controllers/concerns/cache_concern.rb b/app/controllers/concerns/cache_concern.rb index 8d82eda5c19..3fb4b962a3a 100644 --- a/app/controllers/concerns/cache_concern.rb +++ b/app/controllers/concerns/cache_concern.rb @@ -38,7 +38,7 @@ module CacheConcern klass.reload_stale_associations!(cached_keys_with_value.values) if klass.respond_to?(:reload_stale_associations!) unless uncached_ids.empty? - uncached = klass.where(id: uncached_ids).with_includes.each_with_object({}) { |item, h| h[item.id] = item } + uncached = klass.where(id: uncached_ids).with_includes.index_by(&:id) uncached.each_value do |item| Rails.cache.write(item, item) diff --git a/app/lib/entity_cache.rb b/app/lib/entity_cache.rb index e38a3adcdcb..5d51e858529 100644 --- a/app/lib/entity_cache.rb +++ b/app/lib/entity_cache.rb @@ -25,7 +25,7 @@ class EntityCache end unless uncached_ids.empty? - uncached = CustomEmoji.where(shortcode: shortcodes, domain: domain, disabled: false).each_with_object({}) { |item, h| h[item.shortcode] = item } + uncached = CustomEmoji.where(shortcode: shortcodes, domain: domain, disabled: false).index_by(&:shortcode) uncached.each_value { |item| Rails.cache.write(to_key(:emoji, item.shortcode, domain), item, expires_in: MAX_EXPIRATION) } end diff --git a/app/lib/settings/scoped_settings.rb b/app/lib/settings/scoped_settings.rb index ef694205c43..acabf0c8e05 100644 --- a/app/lib/settings/scoped_settings.rb +++ b/app/lib/settings/scoped_settings.rb @@ -30,7 +30,7 @@ module Settings def all_as_records vars = thing_scoped - records = vars.each_with_object({}) { |r, h| h[r.var] = r } + records = vars.index_by(&:var) Setting.default_settings.each do |key, default_value| next if records.key?(key) || default_value.is_a?(Hash) diff --git a/app/lib/webfinger.rb b/app/lib/webfinger.rb index c7aa43bb334..7023659395b 100644 --- a/app/lib/webfinger.rb +++ b/app/lib/webfinger.rb @@ -21,7 +21,7 @@ class Webfinger private def links - @links ||= @json['links'].map { |link| [link['rel'], link] }.to_h + @links ||= @json['links'].index_by { |link| link['rel'] } end end diff --git a/app/models/account.rb b/app/models/account.rb index 75ebfb2f336..6f5bc6295cb 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -273,7 +273,7 @@ class Account < ApplicationRecord end def tags_as_strings=(tag_names) - hashtags_map = Tag.find_or_create_by_names(tag_names).each_with_object({}) { |tag, h| h[tag.name] = tag } + hashtags_map = Tag.find_or_create_by_names(tag_names).index_by(&:name) # Remove hashtags that are to be deleted tags.each do |tag| diff --git a/app/models/notification.rb b/app/models/notification.rb index b6db37d6dcd..5e9ea62a0d5 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -96,7 +96,7 @@ class Notification < ApplicationRecord return if account_ids.empty? - accounts = Account.where(id: account_ids).includes(:account_stat).each_with_object({}) { |a, h| h[a.id] = a } + accounts = Account.where(id: account_ids).includes(:account_stat).index_by(&:id) cached_items.each do |item| item.from_account = accounts[item.from_account_id] diff --git a/app/models/setting.rb b/app/models/setting.rb index a5878e96a21..4bcaa060ff1 100644 --- a/app/models/setting.rb +++ b/app/models/setting.rb @@ -40,7 +40,7 @@ class Setting < RailsSettings::Base def all_as_records vars = thing_scoped - records = vars.each_with_object({}) { |r, h| h[r.var] = r } + records = vars.index_by(&:var) default_settings.each do |key, default_value| next if records.key?(key) || default_value.is_a?(Hash) diff --git a/app/models/status.rb b/app/models/status.rb index 558a37f99a3..fcc7a026d5c 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -301,7 +301,7 @@ class Status < ApplicationRecord return if account_ids.empty? - accounts = Account.where(id: account_ids).includes(:account_stat).each_with_object({}) { |a, h| h[a.id] = a } + accounts = Account.where(id: account_ids).includes(:account_stat).index_by(&:id) cached_items.each do |item| item.account = accounts[item.account_id] diff --git a/app/models/trending_tags.rb b/app/models/trending_tags.rb index c69f6d3c331..9c2aa0ee8b2 100644 --- a/app/models/trending_tags.rb +++ b/app/models/trending_tags.rb @@ -91,7 +91,7 @@ class TrendingTags tags = Tag.where(id: tag_ids) tags = tags.trendable if filtered - tags = tags.each_with_object({}) { |tag, h| h[tag.id] = tag } + tags = tags.index_by(&:id) tag_ids.map { |tag_id| tags[tag_id] }.compact.take(limit) end diff --git a/lib/mastodon/media_cli.rb b/lib/mastodon/media_cli.rb index 5f4a414b1a5..59c118500ac 100644 --- a/lib/mastodon/media_cli.rb +++ b/lib/mastodon/media_cli.rb @@ -326,7 +326,7 @@ module Mastodon end preload_map.each_with_object({}) do |(model_name, record_ids), model_map| - model_map[model_name] = model_name.constantize.where(id: record_ids).each_with_object({}) { |record, record_map| record_map[record.id] = record } + model_map[model_name] = model_name.constantize.where(id: record_ids).index_by(&:id) end end end diff --git a/spec/models/notification_spec.rb b/spec/models/notification_spec.rb index d2e676ec26e..0a045904bb2 100644 --- a/spec/models/notification_spec.rb +++ b/spec/models/notification_spec.rb @@ -71,7 +71,7 @@ RSpec.describe Notification, type: :model do before do allow(accounts_with_ids).to receive(:[]).with(stale_account1.id).and_return(account1) allow(accounts_with_ids).to receive(:[]).with(stale_account2.id).and_return(account2) - allow(Account).to receive_message_chain(:where, :includes, :each_with_object).and_return(accounts_with_ids) + allow(Account).to receive_message_chain(:where, :includes, :index_by).and_return(accounts_with_ids) end let(:cached_items) do