我有以下简单的查找条件:
Player.where('id NOT IN (?)', @groups.collect {|g| g.player_ids}.flatten)
所以这会找到目前不在任何组中的所有玩家,对吧?好吧,问题是如果任何组中没有玩家,则不会显示任何内容。原因是生成了以下SQL:
SELECT "players".* FROM "players" WHERE (id NOT IN (NULL))
这对我来说似乎是一个奇怪的默认值,我在Rails 3.0.7和3.1.0.rc4中测试了它,结果相同。现在我可以创建一些条件,如果@ groups.collect {| g | g.player_ids}是空的,但是有更好的方法吗?
答案 0 :(得分:3)
我意识到这是一个老问题,Rails4现在有了where.not运算符,但对于那些仍然在Rails3上的人,我发现这比接受的答案更可口。我不相信它的Postgres,但我还没有在其他任何地方测试它。
ids = @groups.collect {|g| g.player_ids}.flatten)
Player.where('id not in (coalesce(?,0))', ids)
答案 1 :(得分:2)
你可能不喜欢这样,但是......
Player.where('id not in (select id from players where id in (?))',
@groups.collect {|g| g.player_ids}.flatten)
答案 2 :(得分:0)
@groups.collect {|g| g.player_ids}.flatten.join(',')