Avoiding Default Load in Datamapper Loop


I am new to Ruby on Rails and Datamapper. I have written models using Datamapper, one of my model name is Student. In one view haml file I have written the following code:

-students = Student.all
-students.each |student|
  %td= student.roll_no
  %td= student.type if student.type
  %td= student.department.name

Here I have used newrelic -rpm for profiling my code. Here I found that in each iteration of the above block, one query of the form select prop1, prop2,... from students where id ="some value" is being generated. This is very undesired as it is taking time on each iteration of the block. I think it's due to lazy loading. I have spent nearly a week on that but found nothing to avoid this. If anyone have any idea regarding this please help me. Thank you.

It could be helpful if you could show us the schema of the Students table in app/db/schema.rb.

I suspect your problem is not that each iteration of student takes so long because of lazy evaluation of each row in students, but that it has to load the department in each step. The Student.all is, since Rails 4, lazily evaluated, but it loads the whole set at once.

In order to solve your issue, you have to write Student.includes(:department) in your first line.