Предположим, я занимаюсь подбором пользователей и игр.
У меня есть модели, содержащие пользователей и игры.
class Game < ActiveRecord::Base
has_and_belongs_to_many :users
class User < ActiveRecord::Base
has_and_belongs_to_many :games
Игры могут иметь много пользователей, пользователи могут играть во многие игры. Из-за HASBM у меня тоже есть таблица с именем games_users.
Я хочу искать и находить игры, которые ждут игроков, которые также не содержат имя пользователя игрока (т.е. я не хочу добавлять одного и того же игрока в игру дважды ...)
Я хочу что-то вроде этого:
@ game = Game.find_by_status (Status :: WAITING_USERS,: condition => "game.users.doesnt_contain ('username = player')
Но я не уверен, как это сделать?
Обновление:
Используя решение jdl, я получил код для запуска, но в результатах вернулись элементы, которые я пытался исключить. Вот мой тестовый код:
logger.debug "Excluding user: #{@user.id}"
games = Game.excluding_user(@user)
if (games != nil && games.count > 0)
@game = Game.find(games[0].id)
games[0].users.each {
|u|
logger.debug "returned game user: #{u.id}"
}
end
(вышеприведенный код также напрашивается на 2 вопроса .... - как получить результат только одной игры вместо массива и как получить версию, не предназначенную только для чтения; поэтому я делаю второй Game.find ...)
А вот вывод в журнале:
Excluding user: 2
Game Load (0.3ms) SELECT `games`.* FROM `games` left outer join games_users gu on gu.game_id = games.id WHERE (gu.game_id is null or gu.user_id != 2)
Game Columns (1.0ms) SHOW FIELDS FROM `games`
SQL (0.2ms) SELECT count(*) AS count_all FROM `games` left outer join games_users gu on gu.game_id = games.id WHERE (gu.game_id is null or gu.user_id != 2)
Game Load (0.1ms) SELECT * FROM `games` WHERE (`games`.`id` = 3)
games_users Columns (6.8ms) SHOW FIELDS FROM `games_users`
User Load (0.9ms) SELECT * FROM `users` INNER JOIN `games_users` ON `users`.id = `games_users`.user_id WHERE (`games_users`.game_id = 3 )
returned game user: 1
returned game user: 2