Ruby on Rails Wednesday, July 2, 2014

On Wednesday, July 2, 2014 1:38:37 PM UTC+1, Ruby-Forum.com User wrote:
Now I learned from
http://guides.rubyonrails.org/active_record_querying.html , that this is
inefficient, due to the SELECT statements generated inside the block,
and that I should do "eager loading" instead. From my understanding of
the tutorial, I should replace 'joins' by 'includes':

plist=Parent.includes(:children).select('*').where("parents.id=children.parent_id
and children.cfield=#{...}")

However, this raises the exception that there would be no column
"children.cfield".

It seems that with 'includes', we can only query based on values of the
Parent table.

Is this correct?


In rails 4.1  (or possibly 4.0) and later you must use references if you are adding conditions on one of the joined columns, ie

  Parent.includes(:children).references(:children)

So that rails knows it must use the joins based eager loading strategy (rails used to try and guess this for you but this was rather error-prone). You also don't need the select('*')
 
Fred

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-talk+unsubscribe@googlegroups.com.
To post to this group, send email to rubyonrails-talk@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/rubyonrails-talk/e352ab6e-ce3e-4c2e-9631-56fc5e67517f%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment