2012-04-30 39 views
19

Tôi có một mô hình Người dùng và người dùng có mối quan hệ là vật nuôi có nhiều. Tôi muốn có thể viết truy vấn ActiveRecord nơi tôi có thể chọn tất cả người dùng có thú cưng không có pet.name "fluffy"Ruby on Rails Truy vấn ActiveRecord bằng cách sử dụng một tham gia

Cách hiệu quả nhất để viết điều này bằng ActiveRecord là gì? Sử dụng SQL thẳng nó sẽ trông giống như sau:

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

Trả lời

37

này nên làm việc:

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

Ngoài ra bạn có thể muốn đọc following part (trên joins) trên những hướng dẫn chính thức RoR.

+2

Xin vui lòng sửa tôi nếu tôi là sai, nhưng nó sẽ không có 'User.joins (: pet) ...' - số nhiều - cho tham số ký hiệu? – jeffdill2

+2

@ jeffdill2 Điều đó phụ thuộc vào cách liên kết được xác định. Nếu User 'has_one: pet', ví dụ, bạn sẽ đúng. –

+0

@MikeC ah, ngay trên. – jeffdill2

14

Cách sạch mà không lỗ hổng SQL injection đang sử dụng tham số truy vấn:

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

Một số trình điều khiển cơ sở dữ liệu sẽ sử dụng báo cáo chuẩn bị cho ở trên để tái sử dụng kế hoạch truy vấn cơ sở dữ liệu. Trong trường hợp này, cơ sở dữ liệu không phải phân tích truy vấn một lần nữa khi chỉ có giá trị param khác nhau.

24

Trong ray 4 bạn có thể làm điều này thậm chí rõ ràng hơn:

User.joins(:pets).where.not(pets: { name: 'fluffy' }) 
Các vấn đề liên quan