2010-11-19 2 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), но он не только загружает инвестиции для всех пользователей, но и выполняет отдельный запрос для каждой игры, чтобы найти или инициализировать инвестиционный объект.

Одним словом, учитывая список игровых идентификаторов и идентификатор учетной записи, какой чистый способ загрузить связанные объекты инвестиций, которые существуют в одном запросе, и инициализировать остальные?

ответ

0

Вы хотите указать список идентификаторов на сервер за один раз. Я использую оператор IN для этого:

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

Это работает тот же запрос, у меня был выше, Game.includes (: инвестиции) .find (LIST_OF_IDS) – icecream

+0

@Violet В этом случае он должен быть 'includes' вызов что делает их отдельными. –

Смежные вопросы