\n\n1\n<\/tt>2\n<\/tt>3\n<\/tt>4\n<\/tt>5<\/strong>\n<\/tt>6\n<\/tt>7\n<\/tt>8\n<\/tt>9\n<\/tt>10<\/strong>\n<\/tt>11\n<\/tt>12\n<\/tt>13\n<\/tt>14\n<\/tt>15<\/strong>\n<\/tt>16\n<\/tt>17\n<\/tt>18\n<\/tt>19\n<\/tt>20<\/strong>\n<\/tt><\/pre>\n<\/td>\n\n\n<\/tt> >> requests = Request<\/span>.find(:all<\/span>)\n<\/tt> >> request1 = requests[0<\/span>]\n<\/tt> => #<Request:0x2a9c93f360 @attributes={.....}><\/span>\n<\/tt> >> request2 = requests[1<\/span>]\n<\/tt> => #<Request:0x2a9c93f310 @attributes={.....}> <\/span>\n<\/tt> >> request1.diff?(request2)\n<\/tt> => true<\/span>\n<\/tt> >> request1.diff(request2)\n<\/tt> => {:last_email_alert_at<\/span>=>[Wed<\/span> Apr<\/span> 11<\/span> 15<\/span>:36<\/span>:03<\/span> MDT<\/span> 2007<\/span>, nil<\/span>], \n<\/tt> :description<\/span>=>["<\/span>hello<\/span>"<\/span><\/span>, "<\/span>goodbye<\/span>"<\/span><\/span>],\n<\/tt> :due_date<\/span>=>[#<Date: 4908383\/2,0,2299161>, <\/span>\n<\/tt> #<Date: 4908421\/2,0,2299161>], <\/span>\n<\/tt> :summary<\/span>=>["<\/span>Do this for me.....<\/span>"<\/span><\/span>, "<\/span>Test<\/span>"<\/span><\/span>], \n<\/tt> :created_at<\/span>=>[Mon<\/span> Apr<\/span> 09<\/span> 10<\/span>:58<\/span>:24<\/span> MDT<\/span> 2007<\/span>, \n<\/tt> Mon<\/span> Apr<\/span> 09<\/span> 11<\/span>:08<\/span>:17<\/span> MDT<\/span> 2007<\/span>], \n<\/tt> :last_email_alert_by<\/span>=>[2<\/span>, nil<\/span>], \n<\/tt> :version<\/span>=>[30<\/span>, 1<\/span>], \n<\/tt> :updated_at<\/span>=>[Wed<\/span> Apr<\/span> 11<\/span> 15<\/span>:36<\/span>:03<\/span> MDT<\/span> 2007<\/span>, \n<\/tt> Mon<\/span> Apr<\/span> 09<\/span> 11<\/span>:08<\/span>:17<\/span> MDT<\/span> 2007<\/span>]}\n<\/tt><\/pre>\n<\/td>\n<\/tr>\n<\/table>\nYah, so that is cool, but with a little more time on my hands I decided to figure out what is going on behind the scenes. \nHere is how you would normally get a diff between hashes, unfortunately you will see later this does not work so well: \nFirst, create the hashes:<\/p>\n \n\n\n1\n<\/tt>2\n<\/tt>3\n<\/tt>4\n<\/tt><\/pre>\n<\/td>\n\n >> r1 = requests[0<\/span>].attributes\n<\/tt> => {...}\n<\/tt> >> r2 = requests[1<\/span>].attributes\n<\/tt> => {...}\n<\/tt><\/pre>\n<\/td>\n<\/tr>\n<\/table>\nNext, show that the records contain the same keys:<\/p>\n \n\n\n1\n<\/tt>2\n<\/tt><\/pre>\n<\/td>\n\n >> r1.keys - r2.keys\n<\/tt> => [] \n<\/tt><\/pre>\n<\/td>\n<\/tr>\n<\/table>\nLet's get the diffs, one for first - second and one for second - first:<\/p>\n \n\n\n1\n<\/tt>2\n<\/tt>3\n<\/tt>4\n<\/tt>5<\/strong>\n<\/tt>6\n<\/tt>7\n<\/tt><\/pre>\n<\/td>\n\n >> diff_2_1 = r2.values - r1.values\n<\/tt> => [Mon<\/span> Apr<\/span> 09<\/span> 11<\/span>:08<\/span>:17<\/span> MDT<\/span> 2007<\/span>, 4<\/span>, "<\/span>Test<\/span>"<\/span><\/span>, "<\/span>goodbye<\/span>"<\/span><\/span>, \n<\/tt> #<Date: 4908421\/2,0,2299161>, Mon Apr 09 11:08:17 MDT 2007]<\/span>\n<\/tt> >> diff_1_2 = r1.values - r2.values\n<\/tt> => [Wed<\/span> Apr<\/span> 11<\/span> 15<\/span>:36<\/span>:03<\/span> MDT<\/span> 2007<\/span>, Wed<\/span> Apr<\/span> 11<\/span> 15<\/span>:36<\/span>:03<\/span> MDT<\/span> 2007<\/span>, \n<\/tt> 3<\/span>, 30<\/span>, "<\/span>Do this for me.....<\/span>"<\/span><\/span>, "<\/span>Hello<\/span>"<\/span><\/span>, #<Date: 4908383\/2,0,2299161>, <\/span>\n<\/tt> Mon<\/span> Apr<\/span> 09<\/span> 10<\/span>:58<\/span>:24<\/span> MDT<\/span> 2007<\/span>]\n<\/tt><\/pre>\n<\/td>\n<\/tr>\n<\/table>\nThis would be perfect if the results of the hash diffs were the same size:<\/p>\n \n\n\n1\n<\/tt>2\n<\/tt>3\n<\/tt>4\n<\/tt><\/pre>\n<\/td>\n\n >> diff_1_2.size\n<\/tt> => 8<\/span>\n<\/tt> >> diff_2_1.size\n<\/tt> => 6<\/span>\n<\/tt><\/pre>\n<\/td>\n<\/tr>\n<\/table>\nWell this means we can't assume the indexes match. So here is how we really need to get the hash differences:<\/p>\n \n\n\n1\n<\/tt>2\n<\/tt>3\n<\/tt>4\n<\/tt>5<\/strong>\n<\/tt>6\n<\/tt>7\n<\/tt>8\n<\/tt>9\n<\/tt>10<\/strong> | | | | | | | | | | |