2016-04-13 12 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 

そして他の多くの、ない重要。 私はちょうど移動という名前の「ポンド」と私が試した他の移動「メガパンチ」

を持っている可能性がポケモンを検索したいと思います:

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

1つの移動だけを検索すると、うまく動作しますが、2つの移動で取得できません。

私は多くのことを試しましたが、すべて悪い結果に終わります。 もちろん、ポケモンにはその動きがあります。私がすれば、これら2つの動きを取り出すことができます。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のものを検索しているためです。

にコードを変更し

:あなたのSQLにANDwhere結果をチェーン

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

ORが必要な場合は、上の例のような配列を使用するか、独自のsqlを記述します。

+0

あなたのコードはORリクエストを行います。私は「ポンド」や「メガパンチ」を持っているポケモンを手に入れたくない、「ポンド」と「メガパンチ」を持ったポケモンを欲しい。ご回答有難うございます ! –

関連する問題