Active Record: Eager Loading (syntax question)

Let's have model :parents and :children, where one parent can have many children, and that I want to do something like this:

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

plist.each { |p| do_something_with(p,p.children) }

Now I learned from Active Record Query Interface — Ruby on Rails Guides , 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