Active Record不存在连接表记录的情况

时间:2017-02-12 21:07:51

标签: sql ruby-on-rails activerecord rails-activerecord

我正在尝试获取连接表中不存在的所有记录的列表。

模型是User,Game和MarkedGame,用户可以将游戏标记为已播放。这是一个多对多的关系:

User > MarkedGame < Game

我想要的是用户标记没有的所有游戏的列表。

我知道我可以做两个单独的查询并减去它们:

Game.all - current_user.games

但是我不喜欢这样我就得到了一个数组而不是一个Active Record关系对象。此外,似乎应该有更高效的方式。

如果没有Active Record处理方式,是否有SQL方式?我的原始SQL不是特别强大,所以对此的任何帮助都会受到赞赏。

感谢。

2 个答案:

答案 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))