2011-02-03 68 views
2

如果我有一個Foo類型的模型,有許多類型Bar的子記錄,我希望能夠顯示Foo記錄的列表並顯示子欄的數量記錄。所以我有類似的東西...如何避免與DataMapper聚合N + 1

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

我怎樣才能避免N+1 problem我的聚合?換句話說,我不想爲每一行查詢一個新的SELECT COUNT(*)...。我可以簡單地創建一個SQL視圖並將其映射到一個新的模型,但有沒有更簡單的方法?

回答

1

DataMpper對於這些東西是反覆無常的,所以我會給你幾個選項來嘗試可能取決於你的真實代碼的樣子。

  1. 只要將計數改爲大小,即放入foo.bars.size即可。 DM的戰略性急切加載有時可以使用這種方法。

  2. 在@ foos.each循環之前強制加載負載,並將計數更改爲大小,例如,

    @foos = Foo.all(...) 
    @foos.bars.to_a 
    @foos.each do | foo | 
        puts foo.name 
        puts foo.bars.size 
    end 
    
  3. 問題你@ foos.each循環以foo ID和酒吧計數返回結構前的原始的SQL查詢,由食品ID #map那些成散列,並讓他們在循環中。 (我只是不得不求助於這種無意義的一兩次,我建議在它之前用#1和2來擺弄一下。)