我有三个表:帐户,投资和游戏。投资有一个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,加载一个查询中存在的关联投资对象的简洁方法是什么,并初始化其余的?
答案 0 :(得分:0)
您希望一次性将ID列表提供给服务器。我使用IN
运算符:
Game.includes(:investments).where("games.id IN (?)", list_of_ids)