2010-07-15 23 views
0

這是我現有的代碼。我可以使用一些關於如何優化的指導。實質上,我不想多次運行SQL查詢 - self.active_item?(r)。我在想,我可以做的,而不是做單獨的數據庫查詢,是檢索所有用戶的活動庫存項目(例如,self.active_inventory_items)的數組,然後將其轉換爲項目數組,然後查詢數組,以查看是否related_item ==項目。你怎麼看?重構我的代碼以消除單獨的數據庫查詢

# User has many inventory_items. 
    # Item has many inventory_items. 
    # InventoryItem belongs to user, item. 

# in User Model 
def retrieve_owned_items(purchasing_item) 
    related_items = purchasing_item.related_items # returns an array of Items (related to item user is going to purchase) 

    owned_items = [] 
    unless related_items.nil? 
    related_items.each do |r| # iterate through each related item 
     if self.active_item?(r) then # runs a SQL query every time to check if the related item is currently an active item in the inventory 
     owned_items << InventoryItem.find_by_item_id(r.id) # create an array of related_items already owned 
     end 
    end 
    end 

    return (owned_items.blank? ? nil : owned_items) 
end 

回答

1
def retrieve_owned_items(purchasing_item) 
    if related_items = purchasing_item.related_items 
    InventoryItem.all(:conditions => {:item_id => related_items.map(&:id)}) 
    end 
end