Ruby 如何避免N+;1与DataMapper聚合

Ruby 如何避免N+;1与DataMapper聚合,ruby,datamapper,Ruby,Datamapper,如果我有一个Foo类型的模型,它有许多Bar类型的子记录,我希望能够显示Foo记录的列表并显示子Bar记录的数量。所以我有点像 @foos.each do |foo| puts foo.name puts foo.bars.count end 我如何避免在我的聚合上出现错误?换句话说,我不希望每行都有一个新的selectcount(*)…查询。我可以简单地创建一个SQL视图并将其映射到一个新的模型,但有没有更简单的方法?DataMpper在这些事情上是变化无常的,所以我将给您一些选项来

如果我有一个Foo类型的模型,它有许多Bar类型的子记录,我希望能够显示Foo记录的列表并显示子Bar记录的数量。所以我有点像

@foos.each do |foo|
  puts foo.name
  puts foo.bars.count
end

我如何避免在我的聚合上出现错误?换句话说,我不希望每行都有一个新的
selectcount(*)…
查询。我可以简单地创建一个SQL视图并将其映射到一个新的模型,但有没有更简单的方法?

DataMpper在这些事情上是变化无常的,所以我将给您一些选项来尝试,这可能会根据实际代码的外观而起作用

  • 只需将计数更改为大小,即放入foo.bar.size。DM的战略负载有时可以使用这种方法

  • 在@foos.each循环之前强制加载一个渴望加载,并将计数更改为大小,例如

  • 在@foos.each循环之前发出一个原始SQL查询,该循环返回具有foo id和bar计数的结构,#根据food id将其映射到散列中,并将其放入循环中。(我只需要求助于这种程度的胡说八道一两次,我建议在这之前先摆弄一下#1和#2。)

  • @foos = Foo.all(...)
    @foos.bars.to_a
    @foos.each do | foo |
      puts foo.name
      puts foo.bars.size
    end