我正在尝试获取连接表中不存在的所有记录的列表。
模型是User,Game和MarkedGame,用户可以将游戏标记为已播放。这是一个多对多的关系:
User > MarkedGame < Game
我想要的是用户标记没有的所有游戏的列表。
我知道我可以做两个单独的查询并减去它们:
Game.all - current_user.games
但是我不喜欢这样我就得到了一个数组而不是一个Active Record关系对象。此外,似乎应该有更高效的方式。
如果没有Active Record处理方式,是否有SQL方式?我的原始SQL不是特别强大,所以对此的任何帮助都会受到赞赏。
感谢。
答案 0 :(得分:2)
应该这样做。返回尚未被当前用户标记的所有游戏。
Game.where('id not in (select game_id from marked_games where user_id = ?)', current_user.id)
答案 1 :(得分:2)
您可以尝试以下操作:
Game.where.not(id: MarkedGame.where(user_id: current_user.id).pluck(:game_id))