Merging with different modules
This is nowhere near the full answer, but I just want to touch on the initialize method of Merge real quick since it was the first thing to jump out to me. 

def initialize(destination_id, *source_ids)
  @source_ids = source_ids
  @destination_id = destination_id
  @sources = Modelname.where(id: @source_ids).all
  @destination = Modelname.where(id: @destination_id).first
end


This code is functionally equivalent. Using the splat operator at the end I guarantee the source ids will be in an array.  I'll keep looking at the rest of the code and go from there, but that was the first thing I wanted to point out.