47

User モデルがあり、ユーザーには has_many ペットの関係があります。「ふわふわ」のpet.nameを持たないペットを持つすべてのユーザーを選択できるActiveRecordクエリを記述できるようにしたい

ActiveRecord を使用してこれを記述する最も効率的な方法は何ですか? ストレート SQL を使用すると、次のようになります。

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

4

3 に答える 3

66

これは機能するはずです:

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

また、公式のRoRガイドラインの次の部分(について)を読むことをお勧めします。joins

于 2012-04-30T22:19:29.543 に答える
59

Rails 4 では、これをさらに明確にすることができます。

User.joins(:pets).where.not(pets: { name: 'fluffy' })
于 2015-03-16T14:53:07.273 に答える
24

SQL インジェクションの脆弱性を回避する最もクリーンな方法は、クエリ パラメーターを使用することです。

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

一部のデータベース ドライバーは、上記の準備済みステートメントを使用して、データベース クエリ プランを再利用します。このような場合、param 値のみが異なる場合、データベースはクエリを再度分析する必要はありません。

于 2014-02-04T21:56:18.963 に答える