Modified from Simon's solution.
This one has 3 lines longer, but it takes ~ half time compare to the origin
for finding the happiest between 1 and 100000.

-------------------------------------------------------------------
happy = Hash.new do |h, k|
  digits = k.to_s.split('')
  digits_sorted = digits.sort
  next h[k] = h[digits_sorted.join.to_i] if digits != digits_sorted
  sum = digits.inject(0) {|s, i| s + i.to_i * i.to_i}
  sum != 1 ? (h[k] = 0) : (next h[k] = 1)
  h[k] = (h[sum].nonzero? || -1) + 1
end

puts (1..100000).max {|a, b| happy[a] <=> happy[b]}
-------------------------------------------------------------------