У меня есть три таблицы: счета, инвестиции и игры. Инвестиция имеет 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, существующие в одном запросе, и инициализировать остальные?