On Nov 22, 2014, at 5:03 PM, Sunny Juneja <jr.su...@gmail.com> wrote:
> Hey everyone, > > I've obviously done a bad job of explaining this :). Let me try to elaborate. > > Suppose I've ran xyz = Model.where(attribute: true) > A SQL query is created and executed. The results are saved to xyz as an > ActiveRecord_Relation. The query looks something like this: > SELECT "models".* FROM "models" WHERE "models"."attribute" = ’t' This is a place that people frequently get confused - doing this only runs the query in the REPL, where the result has `inspect` called on it for printing. Try this in the REPL to see the difference: xyz = Model.where(attribute: true); nil This will set `xyz` but not trigger the query. Any subsequent code that attempts to access elements of `xyz` will trigger the query - so `to_a`, or `each`, etc. Note that some methods will trigger a different query - for instance, calling `xyz.first` will perform a query with `LIMIT 1` if the records haven’t been loaded yet. > If I run xyz.find_by(attribute2: false), a nw SQL query is created and > executed and it will hit the database again. The query looks something like > this: > SELECT "models".* FROM "models" WHERE "models"."attribute" = 't' AND > "models"."attribute2" = 'f' LIMIT 1 > On the other hand, the proposed find_in_relation is a method on an > ActiveRecord_Relation that doesn't hit the database and searches the relation > in memory. > > If I type xyz.find_in_relation(attribute2: false), no new sql query is > created and it will not touch the database. The code would be equivalent to > running: > xyz.select { |x| x.attribute2 == false } > > Ideally, find_in_relation would return another ActiveRecord_Relation. > `Relation` is intended to build queries. The results of in-memory filtering are not going to make that possible, in general, short of flattening everything to a giant `id IN (?)` clause. The only use case I can see for something like this is when some of the attributes you’re filtering by aren’t DB columns but instead are model methods. For that case, `select` seems to make the in-memory filtering aspect clearer. —Matt Jones -- 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 rubyonrails-core+unsubscr...@googlegroups.com. To post to this group, send email to rubyonrails-core@googlegroups.com. Visit this group at http://groups.google.com/group/rubyonrails-core. For more options, visit https://groups.google.com/d/optout.
signature.asc
Description: Message signed with OpenPGP using GPGMail