2010-11-19 3 views
0

계정, 투자 및 게임이라는 세 개의 테이블이 있습니다. 투자에는 account_id, game_id 및 일부 통계 카운터가 있으며 처음 계정이 게임에 참여할 때 만들어집니다.Ruby on Rails에서이 쿼리를 효율적으로 작성하려면 어떻게해야합니까?

나는 이런 식으로, 그 게임에서 사용자의 투자와 함께 최신 게임의 JSON 목록을 제공 할 : 그들이 아직 게임에 참여하지 않은 경우

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

, 나는 여전히를 포함 할 기본값 투자 목적은, 그래서 내 게임 모델에서 serializable_hash 기능이 오버라이드 (override) : 나는 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 

을, 레일은 각 게임에 대한 투자 테이블에 별도의 쿼리를 수행합니다. 나는 Game.includes(:investments).find(list_of_ids).to_json(:uid => current_user.id)을 시도했지만 모든 사용자에 대한 투자를로드 할뿐만 아니라 투자 오브젝트를 찾거나 초기화하기 위해 각 게임에 대한 별도의 쿼리를 수행합니다.

간단히 말해서, 게임 ID와 계정 ID의 목록이 주어지면 하나의 쿼리에 존재하는 관련 Investment 오브젝트를로드하고 나머지를 초기화하는 방법은 무엇입니까?

답변

0

당신은 서버에 ID 목록을 한 번에주고 싶습니다. 나는이에 대한 IN 연산자를 사용

같은 제가 위에서 한 쿼리, Game.includes 실행
Game.includes(:investments).where("games.id IN (?)", list_of_ids) 
+0

(: 투자) .find이 경우 (LIST_OF_IDS) – icecream

+0

@Violet는, 그것은'includes' 호출해야합니다 그것은 그들을 분리시키고 있습니다. –

관련 문제