1

我有一个与 Pokemon 有 has_many 关系的 Trainer 模型。我如何找到所有没有特定类型或类型的口袋妖怪的所有训练师(类型是口袋妖怪模型中的一列)?

我尝试过的代码,但是如果他的任何口袋妖怪类型不在组中,它会返回一个教练(例如,如果一个教练有火和电类型的口袋妖怪,他将被返回,因为电不在阵列中。我不不希望他回来,因为他有火系口袋妖怪。)

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

当我只与一种类型进行比较时,也会出现同样的问题。

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

同样,示例训练师将被退回,因为他有一个类型为电动的口袋妖怪,不等于火。

我正在使用 Rails 3.2.13 和 Ruby 1.9.3。

4

3 回答 3

1

我认为没有办法在一个查询中使用 Rails 编写此代码,但您可以执行以下操作:

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"])

这将抓取所有他们的 id 没有出现在带有火、草或水的 pokemon 的 trainer_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 回答