Your example would involve three queries, each only allocating memory and transferring content from the DBMS for 1 result, instead of every record in the table.
In the present: User.all[5] # SELECT "users".* FROM "users" -> 420,000 results My suggestion: User.all[5] # SELECT "users".* FROM "users" LIMIT 1 OFFSET 5 -> 1 result If I understand right, every User is pulled from the database, an array is created with every single possible instance of a User, and then you select a specific value from that array. I am thinking about this in the context of any query. If you want the nth result from that query, it would be nice to have an idiomatic shorthand for that, instead of ".offset(n).first". It appears that even if you are iterating over the elements in a query in such a way, my suggestion would improve performance. This has nothing to do with any of the other functions that are delegated to Array. This is for an ActiveRecord query that one is looking for the nth element within those query results. No one in their right mind would use the delegated '[]' function on a query that could have thousands of results. But they would call the '[]' function that I am suggesting. On Friday, July 12, 2013 1:28:18 PM UTC-4, Olly Smith wrote: > > What do you expect to happen if the code looks like this: > > User.all[5] > User.all[6] > User.all[7] > > Should ActiveRecord make three separate queries? How about if the code > iterates from index 100 to 200? > > Imho, it's totally acceptable to sacrifice 'idiomatic' ruby in this case > in favour of fewer accidental gotchas. > > Olly > On 12 Jul 2013 17:29, "Michael Swan" <[email protected] <javascript:>> > wrote: > >> I am going to make this quick. Try something like: User.all[5] >> Rails presently runs the following query in Postgres: SELECT "users".* >> FROM "users" >> And then gets the 6th element from the array of results. >> >> In reality, User.all[5] should be equivalent to: >> User.limit(1).offset(5).first >> in all circumstances that this addition to the query can be performed. >> This means that someone looking for the nth User, for example, can simply >> use the brackets as is idiomatic in Ruby, to perform the query which is >> truly desired by the user. >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Ruby on Rails: Core" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected] <javascript:>. >> To post to this group, send email to >> [email protected]<javascript:> >> . >> Visit this group at http://groups.google.com/group/rubyonrails-core. >> For more options, visit https://groups.google.com/groups/opt_out. >> >> >> > -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/rubyonrails-core. For more options, visit https://groups.google.com/groups/opt_out.
