我是Ruby on Rails和Datamapper的新手。我使用Datamapper编写模型,我的模型名称之一是Student。在一个视图haml文件中,我编写了以下代码:
-students = Student.all
-students.each |student|
%tr
%td= student.roll_no
%td= student.type if student.type
%td= student.department.name
这里我使用newrelic -rpm来分析我的代码。在这里,我发现在上面的块的每次迭代中,都会生成一个select prop1, prop2,... from students where id ="some value"
形式的查询。这是非常不希望的,因为它在块的每次迭代上花费时间。我认为这是由于延迟加载。我花了将近一个星期的时间,但没有发现任何事情要避免这种情况。如果有人对此有任何想法,请帮助我。谢谢。
答案 0 :(得分:0)
如果您能在Students
向我们展示app/db/schema.rb
表的架构,那将会很有帮助。
我怀疑你的问题并不是学生的每次迭代都需要这么长时间,因为对学生中的每一行都进行了懒惰的评估,但是必须在每一步中加载部门。自Rails 4以来,Student.all
被懒惰地评估,但它立即加载 整个集合。
为了解决您的问题,您必须在第一行写下Student.includes(:department)
。
答案 1 :(得分:0)
您可以强制DataMapper在开始循环之前预加载数据。
将Collection加载到students
后,添加一行,例如:
prefetch = students.collect { |s| s.department }
你不必对prefetch
对象做任何事情; DataMapper将加载所有数据并将其与students
对象关联。然后,您应该发现可以按预期迭代循环,而不会为每个循环生成单独的查询。 (我刚刚在一个正在进行的项目上对此进行了测试,并取得了成功。)