假設我在做用戶和遊戲的配對。 我有模型包含用戶和遊戲。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(狀態:: WAITING_USERS,:條件=>「game.users.doesnt_contain('用戶名=玩家)
但我不知道怎麼辦?
Update:
使用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
(上面的代碼也引出兩個問題.... - 我怎麼了一場比賽,而不是一個數組的結果,以及如何我得到一個非只讀版本它,這就是爲什麼我做的第二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
看起來很有前途,但該語法對於這個新的rails用戶沒有太多的sql經驗。當我嘗試它時,我從mysql獲得以下可怕的消息: 遊戲加載(0.0ms)Mysql ::錯誤:您的SQL語法有錯誤; ((''games'.'status' = 2)AND(gu.game_id爲null或gu.user_id!= 2))''檢查與您的MySQL服務器版本對應的手冊,在第1行:選擇'遊戲'。*從'遊戲'離開外部連接games_users gu gu.game_id ='games'.id其中((''games'.'status' = 2)AND(gu.game_id爲null或gu.user_id!= 2)) – cmaughan 2009-09-15 17:28:01
..和 異常:Mysql ::錯誤:您的SQL語法有錯誤; ((''games'.'status' = 2)AND(gu.game_id爲null或gu.user_id!= 2))''檢查與您的MySQL服務器版本對應的手冊,在第1行:選擇'遊戲'。*從'遊戲'離開外部連接games_users gu gu.game_id ='games'.id其中((''games'.'status' = 2)AND(gu.game_id爲null或gu.user_id!= 2)) – cmaughan 2009-09-15 17:28:32
奇怪。這是用sqlite測試的代碼,但也許MySQL做了一些奇怪的事情。我會把它放在那裏看看。 – jdl 2009-09-15 18:00:34