2010-07-15 5 views
0

여기 내 기존 코드가 있습니다. 이 방법을 최적화하는 방법에 대한 지침을 사용할 수 있습니다. 필자는 본질적으로 SQL 쿼리를 두 번 이상 실행하지 않으려합니다. self.active_item? (r). 내가 별도의 DB 쿼리를 만드는 대신 할 수있는 일은 모든 사용자의 활성 인벤토리 항목 (예 : self.active_inventory_items)의 배열을 검색하고이를 항목 배열로 변환 한 다음 배열을 쿼리하여 related_item == item. 어떻게 생각해?별도의 DB 쿼리를 제거하기 위해 리팩터링 코드

# 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 
관련 문제