I am 100% agree with every word. And I tried to make it like you've proposed: so that relation is only loaded if required within block. But it was too radical change because of a way how tests are written.

Most tests written for `find_in_batches` use `assert_queries` In case when loading the relation is not forced within block number of queries increase 3x times because of `relation.size` and `relation.last.id` calls.

I decided to stop with current changes and get them merged before moving forward because don't want core team to see a PR that changes 20+ tests where it is hard to estimate potential compatibility damage.