2010-11-19 33 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