2016-04-13 8 views
0

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.

Antwort

0

Der Grund, warum Sie keine Ergebnisse erhalten, ist, weil Sie nach Moves mit dem Namen pound UND dem Namen mega punch suchen.

Ihren Code ändern:

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

Chaining where Ergebnisse in AND in der SQL. Wenn Sie wollen OR, verwenden Sie entweder ein Array wie im obigen Beispiel, oder schreiben Sie Ihre eigenen SQL.

+0

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 ! –