Un paio di cose saltano fuori.
In primo luogo, se questo codice viene chiamato 2000 volte e richiede 250 ms in più per l'esecuzione, sono circa 0,125 ms per chiamata per convertire l'Arel in SQL, il che non è irrealistico.
In secondo luogo, non sono sicuro degli interni di Range in Ruby, ma lower..upper
potrebbe eseguire calcoli come la dimensione dell'intervallo e altre cose, il che sarà un grande successo in termini di prestazioni.
Vedi lo stesso successo in termini di prestazioni con quanto segue?
sum = Table.
where(:id => id).
where(:created_at => "BETWEEN ? and ?", lower, upper).
sum(:my_column)