2012-05-27 73 views
0

我有兩個Rails 3模型,ProductRoom定義如下。每個房間可以有多個產品,每個產品可以在多個房間:構建最高效的Rails 3 has_many:通過查詢

class Product < ActiveRecord::Base 
    #... 
    has_many :rooms, :through => :product_selection 
    has_many :product_selection 
end 

class Room < ActiveRecord::Base 
    #... 
    has_many :products, :through => :product_selection 
    has_many :product_selection 
end 

class ProductSelection < ActiveRecord::Base 
    #... 
    belongs_to :product 
    belongs_to :room 
end 

我想內rooms_controller.rb創建一個查詢返回的記錄的第10間客房,併爲每個房間包括一個計數推送到該房間的產品數量(查找每個房間中有多少種產品)以及產品中名爲cost的列中所有產品的總和(以獲得房間中所有產品的總成本) 。在調用查詢後,理想情況下,我最好能夠與房間字段一起呼叫@rooms[i].total_products@rooms[i].total_cost(或類似的東西),以便可以通過模板輕鬆進行消解和迭代。

我知道我可以創建10個不同的電話,然後通過@ room.products.count和@ room.products.sum(cost)循環每個電話,但必須有一個更有效的方法...並且我有一個感覺我忽略了一些明顯的東西。

謝謝!

回答

1

天真的實施將讓你做N + 1個查詢...

如果你的願望是隻高效算你的產品,我建議實施:counter_cache

雖然你還需要執行一個計算(成本總和),急切地加載與房間查詢的產品將是更加可取的。這個想法是要返回你的房間和他們的產品清單。

room_array = Room.includes(:products).limit(10) 

如果還有人希望使這種效率更高,您可能希望讓數據庫也進行求和。