Предположим, что я занимаюсь поиском друзей и игр. У меня есть модели, содержащие пользователей и игры.ActiveRecord найти информацию об ассоциации
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,: условие => «game.users.doesnt_contain ('имя пользователя = игрок')
Но я не уверен, как это сделать?
Обновление:
Используя решение 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
Выглядит многообещающе, но этот синтаксис довольно непрозрачен этот новый пользователь рельсов без особого опыта работы с sql. Я получаю следующее ужасное сообщение из mysql, когда я его пытаюсь: Загрузка игры (0.0ms) Mysql :: Ошибка: у вас возникла ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с .id WHERE (('games'.'status' = 2) AND (gu.game_id имеет значение null или gu.user_id! = 2)) ' в строке 1: SELECT 'games'. * FROM' games' left external join games_users gu on gu.game_id = 'games'.id WHERE (('games'.'status' = 2) AND (gu.game_id имеет значение null или gu.user_id! = 2)) – cmaughan
.. и Исключение: Mysql :: Ошибка: у вас возникла ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с .id WHERE (('games'.'status' = 2) AND (gu.game_id имеет значение null или gu.user_id! = 2)) ' в строке 1: SELECT 'games'. * FROM' games' left external join games_users gu on gu.game_id = 'games'.id WHERE (('games'.'status' = 2) AND (gu.game_id имеет значение null или gu.user_id! = 2)) – cmaughan
Странно. Это был протестированный код с sqlite, но, возможно, MySQL делает с ним что-то странное. Я выстрелю туда и посмотрю. – jdl