2010-11-19 60 views
0

我有三個表格:賬戶,投資和遊戲。投資有一個account_id,game_id和一些統計計數器,並且在賬戶第一次參與遊戲時創建。如何在Ruby on Rails中有效地寫這個查詢?

我想提供最新的遊戲的JSON列表與用戶的在那場比賽的投資一起,就像這樣:

[{id: 666, name: "Foobar", ..., investment: {tokens: 58, credits: 42, ...}},...] 

如果他們還沒有參加過比賽,我還是想包括使用默認值投資對象,所以我推翻在我的遊戲模式serializable_hash功能:

# game.rb 
has_many :investments 
def serializable_hash(options=nil) 
    options ||= {} 
    i = investments.find_or_initialize_by_account_id options[:uid] 
    {:id => id, ..., :investment => i.serializable_hash} 
end 

然而,當我運行像Game.find(list_of_ids).to_json(:uid => current_user.id),Rails會在投資表中的每個遊戲一個單獨的查詢。我嘗試了Game.includes(:investments).find(list_of_ids).to_json(:uid => current_user.id),但不僅會爲所有用戶加載投資,還會爲每個遊戲單獨查詢以查找或初始化投資對象。

簡而言之,給出遊戲ID和帳戶ID列表,加載一個查詢中存在的關聯投資對象,並初始化其餘部分,乾淨的方法是什麼?

回答

0

您想一次性將ID列表提供給服務器。我用的是IN運營商這樣的:

Game.includes(:investments).where("games.id IN (?)", list_of_ids) 
+0

運行相同的查詢,我上面有,Game.includes(:投資).find(LIST_OF_IDS) – icecream 2010-11-20 02:43:02

+0

@Violet在這種情況下,它必須是'includes'通話這使他們分開。 – 2010-11-20 18:29:08