0

我是 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"都会生成一个表单查询。这是非常不希望的,因为块的每次迭代都需要时间。我认为这是由于延迟加载。我已经花了将近一个星期的时间,但没有发现可以避免这种情况。如果有人对此有任何想法,请帮助我。谢谢你。

4

2 回答 2

0

您可以强制 DataMapper 在开始循环之前预加载数据。

将 Collection 加载到 中后students,添加一行,例如:

prefetch = students.collect { |s| s.department }

您不必对prefetch对象做任何事情;DataMapper 将加载所有数据并将其与students对象关联。然后您应该发现您可以按预期迭代循环,而无需为每个循环生成单独的查询。(我刚刚在我正在进行的一个项目上对此进行了测试,并且它成功了。)

于 2014-11-03T12:20:56.313 回答
0

如果您可以向我们Students展示app/db/schema.rb.

我怀疑你的问题不是因为对学生每一行的懒惰评估,学生的每次迭代都需要这么长时间,而是它必须在每一步中加载部门。这Student.all是,因为 Rails 4,懒惰地评估,但它一次加载整个集合。

为了解决您的问题,您必须Student.includes(:department)在第一行中写入。

于 2013-09-11T13:16:48.133 回答