mceachen/closure_tree — pull request #48 by jturkel (2013-03-22 14:42:11+00:00)
Title: Committing large transactions is very slow

Committing transactions involving large numbers of hierarchy model classes is very slow. On my machine committing a transaction involving 1,111 hierarchy model classes takes 5.2 secs.

The problem appears to be that the hierarchy model class overrides == and eql? but not hash. Thus all model instances hash to the same value making the uniq call on the array of modified ActiveRecord instances in ActiveRecord::ConnectionAdapters::DatabaseStatements.commit_transaction_records() very slow. For my test case with 1,111 hierarchy model instances, the call to uniq() makes 2,466,420 calls to the hierarchy model eql? method. If I implement the hierarchy model hash method as follows this drops to 4,326 calls and the commit completes in 0.06 secs:

```
def hash
attributes.hash
end
```