forem/forem · error · StandardError

You cannot merge the same two user IDs

Error message

You cannot merge the same two user IDs

What it means

Moderator::MergeUsers service raises StandardError ('You cannot merge the same two user IDs') when the user to be deleted (@delete_user, looked up from delete_user_id) has the same id as keep_user. The guard exists because merging an account into itself would run identity/content merges against the same row and then send it through Users::DeleteWorker, destroying the surviving account.

Source

Thrown at app/services/moderator/merge_user.rb:16

module Moderator
  class MergeUser < ManageActivityAndRoles
    def self.call(admin:, keep_user:, delete_user_id:)
      new(keep_user: keep_user, admin: admin, delete_user_id: delete_user_id).merge
    end

    attr_reader :keep_user, :admin, :delete_user_id

    def initialize(admin:, keep_user:, delete_user_id:)
      @keep_user = keep_user
      @admin = admin
      @delete_user = User.find(delete_user_id.to_i)
    end

    def merge
      raise StandardError, I18n.t("services.moderator.merge_user.same_user") if @delete_user.id == @keep_user.id

      handle_identities
      merge_content
      merge_follows
      merge_mentions
      merge_profile
      update_social
      # The merged-away row is deleted, but this is a merge, not a GDPR
      # erasure — MLH Core merges the two accounts instead of erasing one.
      Users::DeleteWorker.new.perform(@delete_user.id, true, "merge")
      @keep_user.touch(:profile_updated_at)
      @keep_user.track!("user_merged", { "merged_forem_user_id" => @delete_user.id })
      Users::MergeSyncWorker.perform_async(@keep_user.id)

      EdgeCache::Bust.call("/#{@keep_user.username}")
    end

    private

View on GitHub (pinned to f354c376a7)

Solutions

  1. Double-check the two IDs are distinct before submitting the merge (they are different accounts).
  2. If you meant to merge, re-run with the correct delete_user_id.
  3. Add a UI/caller-side precondition: raise/flash early when params[:keep_user_id] == params[:delete_user_id].

Example fix

# before
Moderator::MergeUsers.call(admin: admin, keep_user: user, delete_user_id: user.id)
# raises 'You cannot merge the same two user IDs'

# after
if keep_user.id == delete_user_id.to_i
  Rails.logger.info('Self-merge requested; nothing to do')
else
  Moderator::MergeUsers.call(admin: admin, keep_user: keep_user, delete_user_id: delete_user_id)
end
Defensive patterns

Strategy: validation

Validate before calling

if keep_user.id == delete_user_id.to_i
  render json: { error: 'Cannot merge a user into itself' }, status: :unprocessable_entity
end

Try / catch

rescue StandardError => e
  flash[:error] = e.message # surfaces 'You cannot merge the same two user IDs'
  redirect_to admin_merge_path
end

Prevention

When it happens

Trigger: An admin submits the user-merge form (or calls Moderator::MergeUsers.call) with the same user id in both the 'keep' and 'delete' fields; also when delete_user_id is passed as a string that to_i's to the same id.

Common situations: Copy-paste error in the /admin merge UI filling both inputs with one id; scripts that loop over user pairs and hit a self-pair; support workflows where the two disputed accounts turned out to be one account.

Related errors


AI-assisted analysis of forem/forem@f354c376a7 (2026-08-21). Data as JSON: /api/errors/0d3d00a967e189b7. Report an issue: GitHub.