假设我在做用户和游戏的配对。 我有模型包含用户和游戏。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