2013-07-06 111 views
3

我們正在嘗試創建一個可以簡化爲博客示例的ActiveRecord查詢,以便於理解。我們如何找到沒有任何評論留下的所有博客文章?Rails - 查找所有沒有任何具有特定值的子項的條目

只要某些評論不是特定用戶,我們當前的查詢就會返回帖子,但是如果有任何評論是由該用戶編寫的,我們需要排除博客文章。有任何想法嗎?

回答

4

最適合的sql語法應該是「not exists」子句。外連接也很受歡迎,但這往往是出於歷史原因,因爲RDBMS查詢優化器不擅長優化包含多條記錄的查詢。

如今一個體面的優化器可以impliment與不存在使用適當的如哈希反連接批量數據進行處理的查詢。

查詢會...

select * 
from posts 
where not exists (
     select null 
     from comments 
     where comments.post_id = posts.id and 
       comments.user_id = 38) 

在軌發言...

Post.where("not exists (select null from comments where comments.post_id = posts.id and comments.user_id = #{user.id}") 

UPDATE:

在軌道更好的語法:

Post.where.not(Comment.where("comments.post_id = posts.id").where(:user_id => user.id}).exists) 
+0

這正是我們需要的!謝謝您的幫助。 –

+0

這太棒了!它應該包含在activerecord中! –

+0

這是輝煌! – saadlulu

2
Post.joins("LEFT JOIN comments ON posts.id = comments.post_id AND user_id = #{user_id}").where("comments.id IS NULL") 
相關問題