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.

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

Reply via email to