如何在Ruby on Rails中有效地编写此查询?

时间:2010-11-19 22:35:53

标签: ruby-on-rails activerecord ruby-on-rails-3

我有三个表:帐户,投资和游戏。投资有一个account_id,game_id,一些统计计数器,并在帐户第一次参与游戏时创建。

我想提供最新游戏的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会对每个游戏的Investments表执行单独的查询。我尝试了Game.includes(:investments).find(list_of_ids).to_json(:uid => current_user.id)但不仅为所有用户加载了投资,它还为每个游戏单独查询以查找或初始化投资对象。

简而言之,给定一个游戏ID列表和一个帐户ID,加载一个查询中存在的关联投资对象的简洁方法是什么,并初始化其余的?

1 个答案:

答案 0 :(得分:0)

您希望一次性将ID列表提供给服务器。我使用IN运算符:

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