Как мне эффективно написать этот запрос в Ruby on Rails? - PullRequest
0 голосов
/ 20 ноября 2010

У меня есть три таблицы: счета, инвестиции и игры. Инвестиция имеет account_id, game_id, некоторые статистические счетчики и создается при первом участии учетной записи в игре.

Я хочу предоставить список последних игр в формате JSON вместе с инвестициями пользователя в эту игру, например:

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

Если они еще не участвовали в игре, я все же хочу включить объект Investment со значениями по умолчанию, поэтому я переопределил функцию 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), но он не только загружает инвестиции для всех пользователей, но и выполняет отдельный запрос для каждой игры, чтобы найти или инициализировать объект инвестиций.

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

1 Ответ

0 голосов
/ 20 ноября 2010

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

Game.includes(:investments).where("games.id IN (?)", list_of_ids)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...