2014-04-16 14 views
7

Tôi đang tìm cách truy vấn tất cả Người dùng không có Nhận xét trong một truy vấn sql đơn lẻ?Rails User.joins.not (...) trong Active Record?

Models:

class User < ActiveRecord::Base 
    has_many :comments 
end 

class Comment < ActiveRecord::Base 
    belongs_to :user 
end 

Vì vậy, tôi muốn điều ngược lại điều này:

User.joins.(:comments).group('users.id') 

Nhưng không như thế này: (vì nó tạo ra hai truy vấn)

User.where.not(id: Comment.pluck(:user_id)) 

Có lẽ cái gì đó như điều này?

User.joins.not.(:comments).group('users.id') 

Cảm ơn mọi đầu vào!

+0

Hãy thử 'User.includes (: comments) .where (bình luận: {id: nil}) ' – MrYoshiji

Trả lời

11

Bạn có thể làm một cái gì đó giống như

User.where.not(id: Comment.select(:user_id)) 

Nếu bạn muốn có một (mặc dù lồng nhau) truy vấn duy nhất.

Nếu không, hãy xem http://guides.rubyonrails.org/active_record_querying.html#joining-tables để sử dụng kết nối bên ngoài.

+1

sẽ sử dụng nó subquery hoặc 2 truy vấn khác nhau? – thethanghn

+2

@thethanghn trong trường hợp này nó sẽ dẫn đến một truy vấn phụ. Bất cứ khi nào bạn chuyển một 'ActiveRecord :: Relation' (là phương thức truy vấn bản ghi hoạt động như' select' và 'where' return) thành một phương thức truy vấn, một truy vấn phụ sẽ cho kết quả. –

2

Nếu bạn đang sử dụng postgresql bạn có thể làm một cái gì đó như thế này

User.joins("LEFT join comments c on users.id = c.comment_id"). 
select("users.id"). 
group("users.id"). 
having("count(users.id) = 1") 

này sẽ tạo ra truy vấn này

select u.id from users u 
LEFT join comments c 
on c.comment_id = u.id 
group by u.id 
having count(u.id) = 1 

truy vấn này không tạo ra hai SQL (không lồng nhau sql), câu trả lời ở trên làm.

+0

'c' và' u 'trong truy vấn đó là gì? – thiebo

+1

@thiebo "c" là bí danh cho bảng nhận xét & "u" là bí danh cho bảng người dùng. Bạn có thể tìm thêm thông tin về bí danh SQL [tại đây] (https://en.wikipedia.org/wiki/Alias_ (SQL)) –

0

Một giải pháp đơn giản User.where("id NOT IN (?)", Comment.pluck(:user_id))

Các vấn đề liên quan