def reorder(things, ids) ordered_things = Array.new(things.size) unless things.size == ids.size (ids - (things.collect{|x| x.id})).collect{|missing| ids[ids.index(missing)] = nil} ids = ids.compact end raise "Out of sync! Found #{ids.size} items in index, but only #{things.size} were found in database! Remove #{(ids - (things.collect{|x| x.id})).to_sentence}." unless things.size == ids.size things.each do |thing| position = ids.index(thing.id) ordered_things[position] = thing end ordered_things end