Пустой массив равен NULL в Rails, где находят - PullRequest
3 голосов
/ 20 июля 2011

У меня есть следующее простое условие поиска:

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} пуст, но есть ли лучший способ сделать это?

Ответы [ 3 ]

3 голосов
/ 16 января 2015

Я понимаю, что это старый вопрос, и в Rails4 теперь есть оператор where.not, но для тех, кто все еще работает на Rails3, я нашел это немного более приемлемым, чем принятый ответ. Я не верю, что это только Postgres, но я нигде не проверял.

ids = @groups.collect {|g| g.player_ids}.flatten)
Player.where('id not in (coalesce(?,0))', ids)
2 голосов
/ 20 июля 2011

Тебе это может не понравиться, но ...

Player.where('id not in (select id from players where id in (?))', 
    @groups.collect {|g| g.player_ids}.flatten)
0 голосов
/ 20 июля 2011
@groups.collect {|g| g.player_ids}.flatten.join(',')
...