2016-04-13 3 views
0

Вот то, что я сейчас:Как искать через вложенные 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'}) 

Но это на самом деле не является эффективным, и я уверен, что мы можем найти лучший способ.

ответ

0

Причина, по которой вы не получаете результатов, заключается в том, что вы ищете ходы с именем pound И имя mega punch.

Изменить код:

Pokemon.joins(:moves).where(moves: {name: ['pound', 'mega-punch']}) 

Цепной where результаты в AND в вашем SQL. Если вы хотите OR, либо используйте массив, как в приведенном выше примере, либо напишите свой собственный sql.

+0

Ваш код выполняет запрос OR. Я не хочу, чтобы у покемонов был «фунт» или «мега-удар», я хочу, чтобы у него был «фунт» и «мега-удар». Спасибо за Ваш ответ ! –

Смежные вопросы