2010-11-19 17 views
0

私は、アカウント、投資、ゲームという3つのテーブルを持っています。投資にはaccount_id、game_id、いくつかの統計カウンタがあり、アカウントが初めてゲームに参加するときに作成されます。このクエリをRuby on Railsで効率的に書くにはどうすればよいですか?

私はこのような、そのゲーム内のユーザーの投資とともに、最新のゲーム、のJSONリストを提供したい:

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

彼らはまだゲームに参加していない場合、私はまだ含めますデフォルト値で投資対象が、私は私のゲームのモデルでserializable_hash機能オーバーライド:私はGame.find(list_of_ids).to_json(:uid => current_user.id)のようなものを実行すると、しかし

# 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 

を、Railsは各ゲームのための投資のテーブルの上に別のクエリを行います。私はGame.includes(:investments).find(list_of_ids).to_json(:uid => current_user.id)を試しましたが、すべてのユーザーの投資を読み込むだけでなく、投資オブジェクトを見つけたり初期化したりするためにゲームごとに別々のクエリを実行します。

つまり、ゲームIDとアカウントIDのリストがあれば、1つのクエリに存在する関連する投資オブジェクトを読み込んで残りの部分を初期化するにはどうしたらよいですか?

答えて

0

idsのリストをサーバーに一度に渡したいとします。

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

私は上記の持っていた同じクエリ、Game.includesを実行します(:投資).find(list_of_ids)その場合 – icecream

+0

@Violet、それは 'includes'の呼び出しでなければなりません私は、このためにIN演算子を使用しますそれはそれらを別々にしています。 –