Guess the presents someone will get by comparing wishlist attributes
It's nice that you were able to implement guess_gifts as a single expression.

I don't recommend writing it that way, though.  For every item in the wishlist, you will scan the entire presents list for a match.  Wouldn't it be nice to just do a lookup instead?  You could do such a lookup if the wishlist were in a more convenient format.

def guess_gifts(wishlist, presents)
  # Transform the wishlist, mapping attributes to a list of names
  wishmap = Hash.new { |hash, attributes| hash[attributes] = [] }
  wishlist.each { |w| wishmap[w.reject { |k| k == :name }].push(w[:name]) }

  # Then just do the lookups
  presents.flat_map { |attributes| wishmap[attributes] }
end


Another benefit is that we're doing a map on presents rather than on wishlist, so I think we might not need to call uniq on the results.