Hier ist, was ich habe jetzt:Wie durch verschachtelte has_many durch suchen?
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
Und viele andere, nicht wichtig. ich gerade möchte für eine Pokémon suchen, die Bewegung namens „Pfund“ und einen anderen Move „Mega-Punch“
ich versucht haben könnte:
Pokemon.joins(:moves).where(moves: {name: 'pound'}).where(moves: {name: 'mega-punch'})
aber kein Ergebnis. Die übersetzte SQL ist:
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"]]
Wenn ich nur für einen Umzug suchen, es funktioniert gut, aber ich kann es nicht mit zwei Zügen erhalten.
Ich habe viele Dinge ausprobiert, aber alle endet zu schlechten Ergebnissen. Natürlich habe ich ein Pokémon, das diese Züge hat, wenn ich Pokemon.find_by_name('golurk').moves
mache, kann ich diese zwei Züge abrufen.
Danke!
UPDATE 1:
Pokemon.joins(:moves).where(moves: {name: 'pound'}) & Pokemon.joins(:moves).where(moves: {name: 'mega-punch'})
Aber es ist wirklich nicht effizient, und ich bin mir ziemlich sicher, dass wir einen besseren Weg finden: ich es einfach mit &
Betreiber arbeiten.
Ihr Code führt eine OR-Anfrage durch. Ich möchte kein Pokémon bekommen, das "Pfund" oder "Mega-Punch" hat, ich möchte eines, das "Pfund" UND "Mega-Punch" hat. Danke für deine Antwort ! –