2011-04-11 64 views
0

我有一段代碼通過id獲取關聯對象,否則它會初始化一個新對象。不知道如何優化活動記錄關聯

def pick_for_game(game_id) 
    picks.find_or_initialize_by_game_id(game_id) 
end 

挑選集合通常會有幾百個項目。這兩個用例有:

  1. 我想調用這個方法15-30場比賽

  2. 我想調用這個方法的所有遊戲

好像目前的做法用例a是可以的,但對於用例b來說絕對是可怕的。我能基於與否挑選這種方法複雜,已即時加載類似如下:

def pick_for_game(game_id) 
    if picks.loaded? 
    new_pick = proc { 
     Pick.new do |p| 
     p.game_id = game_id 
     end 
    } 
    picks.detect(new_pick) do |p| 
     p.game_id == game_id 
    end 
    else 
    picks.find_or_initialize_by_game_id(game_id) 
    end 
end 

然而,就選擇一個方法比其他所有情況比使代碼乾淨了一點其他任何​​好處?任何其他解決這個問題的方法?

回答

0

假設匹克是一個模型,如果你知道game_ids的列表,你可以在一個查詢中獲取指定的奧運會所有現有的精選僅剩餘game_ids初始化新精選:

def picks_for_games(game_ids) 
    existing_picks = Pick.all(:conditions => { :game_id => game_ids }) 
    game_ids_without_picks = game_ids - existing_picks.map{ |x| x.game_id } 
    new_picks = game_ids_without_picks.map { 
       |game_id| Pick.initialize_by_game_id(game_id) 
       } 
    return picks + new_picks 
end 

你可以切換取決於2個實現之間:

if game_ids.is_a?(Array) 

對於b的選項)將在遊戲中添加協會引用它,那麼你可以迅速查詢遊戲,沒有挑(S任何精選)和初始化每個選一個。

Game.all(:conditions => { :picks => nil }).map { |game| Pick.initialize_by_game_id(game.id) }