Вот то, что я сейчас:Как искать через вложенные has_many через?
class Pokemon < ActiveRecord::Base
has_many :pokemon_moves, dependent: :destroy
has_many :moves, through: :pokemon_moves
end
class PokemonMove < ActiveRecord::Base
belongs_to :pokemon
belongs_to :move
end
class Move < ActiveRecord::Base
belongs_to :type
end
И многие другие, не важно. Я просто хотел бы искать покемонов, которые могли бы иметь Move название «фунт» и еще один шаг «мега-удар»
Я попытался:
Pokemon.joins(:moves).where(moves: {name: 'pound'}).where(moves: {name: 'mega-punch'})
Но никакого результата. Переведенный SQL является:
SELECT "pokemons".* FROM "pokemons" INNER JOIN "pokemon_moves" ON "pokemon_moves"."pokemon_id" = "pokemons"."id" INNER JOIN "moves" ON "moves"."id" = "pokemon_moves"."move_id" WHERE "moves"."name" = $1 AND "moves"."name" = $2 [["name", "pound"], ["name", "mega-punch"]]
Если я ищу только на один шаг, он прекрасно работает, но я не могу получить его с двумя ходами.
Я пробовал много вещей, но все заканчивается плохими результатами. Конечно, у меня есть покемон, у которого есть эти ходы, если я это сделаю Pokemon.find_by_name('golurk').moves
Я могу получить эти два хода.
Спасибо!
UPDATE 1: Я сделал это работать просто с помощью &
оператора:
Pokemon.joins(:moves).where(moves: {name: 'pound'}) & Pokemon.joins(:moves).where(moves: {name: 'mega-punch'})
Но это на самом деле не является эффективным, и я уверен, что мы можем найти лучший способ.
Ваш код выполняет запрос OR. Я не хочу, чтобы у покемонов был «фунт» или «мега-удар», я хочу, чтобы у него был «фунт» и «мега-удар». Спасибо за Ваш ответ ! –