2011-07-20 2 views
3

を見つけるRailsの中でNULLです:空の配列はどこがどこ条件を見つける簡単な以下のいる

Player.where('id NOT IN (?)', @groups.collect {|g| g.player_ids}.flatten) 

だから、これは右、どのグループでは、現在ではありませんすべてのプレイヤーを見つけましたか?問題は、どのグループにもプレイヤーがいない場合、何も表示されないということです。

SELECT "players".* FROM "players" WHERE (id NOT IN (NULL)) 

これは私には奇妙デフォルトのように思える、と私は同じ結果とのRails 3.0.7と3.1.0.rc4でそれをテストしてみた:その理由は、次のSQLが生成されます。これで、@ groups.collect {| g | g.player_ids}は空ですが、これを行うにはより良い方法がありますか?

答えて

2

、しかし...

Player.where('id not in (select id from players where id in (?))', 
    @groups.collect {|g| g.player_ids}.flatten) 
+0

それは私の望むやり方で機能し、100より小さいコレクションでしか作業していないので完全に機能します。ありがとう! – amunds

+0

小さなコレクションを使用するとサブクエリはそれほど悪くない – Anatoly

0
@groups.collect {|g| g.player_ids}.flatten.join(',') 
あなたが任意のより良いこれを好まないかもしれない
+0

、それが次のエラー得られますPGError:ERROR:整数のための無効な入力構文:「」 – amunds

+0

このクエリによって生成されたSQLは何を。ところで、このid-sコレクションが空の場合には、あなたはそのケースを処理しますか? – Anatoly

+0

SQL:SELECT "players"。* "players"のWHERE(idはIN( ''))です。コレクションが空の場合、すべてのレコードを取得するようにデフォルト設定されていると仮定して、空のコレクションを処理するために何もしません。 – amunds

3

私はこれが古い問題であり、Rails4は今where.not演算子を持っていることが、Rails3、私のまだそれらのための実現これは受け入れられた答えよりも少し美味しいと感じました。私はそれがPostgresだけだとは思わないが、私はそれ以外のところでそれをテストしていない。 PostgreSQLのでは動作しません。残念ながら

ids = @groups.collect {|g| g.player_ids}.flatten) 
Player.where('id not in (coalesce(?,0))', ids) 
+1

これは私のために働いた唯一の解決策でした!ありがとうございました! :) – Seishin

関連する問題