Reputation: 48490
I have a User model and the user has a relationship which is has_many pets. I want to be able to write an ActiveRecord query where I can select all users with a pet that doesn't have a pet.name of "fluffy"
What's the most efficient way to write this using ActiveRecord? Using straight SQL it would look something such as the following:
select id from users INNER JOIN pets ON u.id = pets.user_id WHERE pets.name != "fluffy"
Upvotes: 56
Views: 106163
Reputation: 3032
In rails 4 you can make this even more clear:
User.joins(:pets).where.not(pets: { name: 'fluffy' })
Upvotes: 77
Reputation: 17145
The cleanest way without SQL injection vulnerability is using query parameters:
User.joins(:pets).where("pets.name != ?", "fluffy")
Some database drivers will utilize prepared statements for above to reuse database query plan. In such case the database doesn't have to analyze query again when only param value varies.
Upvotes: 26
Reputation: 30405
This should work:
User.joins(:pets).where("pets.name != 'fluffy'")
Also you might want to read the following part (on joins
) on the official RoR guidelines.
Upvotes: 66