1

ポケモンと has_many の関係を持つトレーナー モデルがあります。特定のタイプまたはタイプのグループのポケモンを持っていないすべてのトレーナーを見つけるにはどうすればよいですか (タイプはポケモン モデルの列です)。

私が試したコードですが、彼のポケモンのタイプのいずれかがグループにない場合、トレーナーを返します(たとえば、トレーナーが火と電気のタイプのポケモンを持っている場合、電気が配列にないため、彼は返されます。私はドン火のポケモンを持っているので返してほしくありません。)

Trainer.joins(:pokemons).where("pokemons.type NOT IN (?)", ["fire","grass","water"])

1つのタイプと比較するだけでも同じ問題が発生します。

Trainer.joins(:pokemons).where("pokemons.type != ?", "fire")

繰り返しますが、例のトレーナーは、タイプがでんきで、火と等しくないポケモンを持っているため、返されます。

Rails 3.2.13 と Ruby 1.9.3 を使用しています。

4

3 に答える 3

1

これを Rails で 1 回のクエリで記述する方法はないと思いますが、次のようにすることができます。

Trainer.where('trainers.id NOT IN (?)', Pokemon.where(type: ['grass', 'fire', 'water']).pluck(:trainer_id).uniq )

説明版:

# selects the IDs of Trainer having a Pokemon of type Grass||Fire||Water
trainer_ids = Pokemon.where(type: ['grass', 'fire', 'water']).pluck(:trainer_id)
# returns the trainers
Trainer.where('trainers.id NOT IN (?)', trainer_ids)
于 2013-08-02T17:54:41.207 に答える
1

Rails 4 では、次のことができます。

Trainer.where.not(id: Pokemons.select(:trainer_id).where("pokemons.type IN (?)", ["fire","grass","water"])

これは、火、草、または水を持つポケモンのtrainer_idsのリストにIDが表示されないすべてのトレーナーを取得します。

于 2013-08-02T17:00:39.297 に答える
0

別の方法は、ActiveRecord の find_by_sql を使用して SQL レイヤーでクエリを実行することです。

Trainer.find_by_sql [
  "SELECT * FROM trainers
  WHERE id NOT IN
  (SELECT DISTINCT(trainers.id) FROM
  trainers JOIN pokemons
  ON trainers.id = pokemons.trainer_id
  WHERE pokemons.type IN ('grass', 'fire','water'))"
]
于 2013-08-03T07:17:12.370 に答える