2012-04-30 14 views
19

私はUserモデルを持っており、ユーザーはhas_manyペットである関係を持っています。私は "ふわふわ"のpet.nameを持たないペットを持つすべてのユーザーを選択できるActiveRecordクエリを作成できるようにしたいRuby on Rails結合を使用したActiveRecordクエリ

ActiveRecordを使用してこれを書くにはどのような方法が最適ですか?ストレートSQLを使用して、それは次のようになります:

select id from users INNER JOIN pets ON u.id = pets.user_id WHERE pets.name != "fluffy"

答えて

37

これは動作するはずです:

User.joins(:pets).where("pets.name != 'fluffy'") 

また、あなたは(joins上)following partを読みたいかもしれない公式RoRのガイドラインには。

+2

を私が間違っているなら、私を修正してください、それはないだろう「User.joins(:ペット)...」 - 特異 - シンボルパラメータの場合? – jeffdill2

+2

@ jeffdill2それは、関連がどのように定義されるかによって異なります。ユーザー 'has_one:ペット'の場合、たとえば、あなたは正しいでしょう。 –

+0

@MikeCああ、そうです。 – jeffdill2

14

SQLインジェクションの脆弱性のないクリーンな方法は、クエリパラメータを使用している:

User.joins(:pets).where("pets.name != ?", "fluffy") 

一部のデータベースドライバは、データベースのクエリプランを再利用するために、上記のために準備されたステートメントを使用します。このような場合、パラメータ値のみが変化する場合にデータベースはクエリを再度解析する必要はありません。あなたは、これがさらに明確にすることができ、レール4に

24

User.joins(:pets).where.not(pets: { name: 'fluffy' }) 
関連する問題