2014-04-16 3 views
7

Im 단일 SQL 쿼리에서 모든 사용자에게 주석이없는 쿼리를 찾으십니까?Rails User.joins.not (...) Active Record?

모델 :

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

하지만이 좋아 : (이 두 개의 쿼리를 생성하기 때문에)

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

아마 뭔가 같은

class User < ActiveRecord::Base 
    has_many :comments 
end 

class Comment < ActiveRecord::Base 
    belongs_to :user 
end 

그래서 나는 이것의 반대합니다 이?

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

입력 해 주셔서 감사합니다. 단일 (하지만 중첩 된) 쿼리를 원한다면

+0

시도'User.includes (: 댓글) 어디에요 (주석 : {ID : 무기 호})' – MrYoshiji

답변

11

당신은

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

처럼 뭔가를 할 수 있습니다.

그렇지 않으면 외부 결합을 사용하는 경우 http://guides.rubyonrails.org/active_record_querying.html#joining-tables을 확인하십시오.

+1

그것이 하위 쿼리 또는 2 개 개의 다른 쿼리를 사용합니까? – thethanghn

+2

@thethanghn이 경우 하위 쿼리가 생성됩니다. 'ActiveRecord :: Relation' (활성 레코드 쿼리 메소드가'select' 및'where' 리턴과 같은 것)을 쿼리 메소드에 전달할 때마다 하위 쿼리가 발생합니다. –

2

당신이이 쿼리

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 

이 쿼리 (중첩 된 SQL도)이 SQL을 생성되지 않습니다 생성이

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

같은 뭔가를 할 수 postgresql를 사용하는 경우, 위의 대답 않습니다.

+0

그 쿼리에서'c'와'u'는 무엇을 의미합니까? – thiebo

+1

@thiebo "c"는 주석 테이블의 별칭이고 "u"는 users 테이블의 별칭입니다. SQL 별칭에 대한 자세한 내용은 [여기] (https://en.wikipedia.org/wiki/Alias_ (SQL))를 참조하십시오. –

0

또 다른 간단한 해결책 User.where("id NOT IN (?)", Comment.pluck(:user_id))

관련 문제