# HABTM: Records with no parents

**URL:** <https://www.ruby-forum.com/t/habtm-records-with-no-parents/53051>\
**Category:** Rails\
**Created:** [January 24, 2006, 12:45am UTC](https://www.ruby-forum.com/t/habtm-records-with-no-parents/53051 "2006-01-24T00:45:23Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Razorcom](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e68b1a/32.png) [@Razorcom](https://www.ruby-forum.com/u/Razorcom)\
**Post date:** [January 24, 2006, 12:45am UTC](https://www.ruby-forum.com/t/habtm-records-with-no-parents/53051/1 "2006-01-24T00:45:23Z")

</div>

I have a habtm relationship between two models. What I want to do is  
find items that aren’t related. So like if you had authors ↔   
posts, how would you find authors who don’t have any posts? Or posts  
that don’t have an author ?

Thanks,

Alex Strand

[removed\_email\_address@domain.invalid]  
Razorcom

> **[razorcom.com domain name is for sale. Inquire now.](https://www.razorcom.com/)**
>
> razorcom.com is available for purchase. Get in touch to discuss the possibilities!

* * *

Our company, Razorcom, is developing a product called LiquiPages.  
LiquiPages is a way for content owners to maintain their websites and  
publish changes from a centralized location. If you are interested  
in helping us with our beta test, please visit http://  
[www.liquipages.com/](http://www.liquipages.com/)

* * *

Visit the Razorcom Blog, Revolution Trigger, at:  
[http://www.razorcom.com/blog/](http://www.razorcom.com/blog/)

---

<div class="post-metadata">

**Author:** ![Razorcom](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e68b1a/32.png) [@Razorcom](https://www.ruby-forum.com/u/Razorcom)\
**Post date:** [January 24, 2006, 1:12am UTC](https://www.ruby-forum.com/t/habtm-records-with-no-parents/53051/2 "2006-01-24T01:12:36Z")

</div>

Hi there.  
Hope I get you right. Is this what you want?

authors.each do |author|  
if author.posts.empty?  
do\_stuff  
end  
end

---

<div class="post-metadata">

**Author:** ![Razorcom](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e68b1a/32.png) [@Razorcom](https://www.ruby-forum.com/u/Razorcom)\
**Post date:** [January 24, 2006, 1:18am UTC](https://www.ruby-forum.com/t/habtm-records-with-no-parents/53051/3 "2006-01-24T01:18:45Z")

</div>

Well I think actually backwards… like, what posts have no authors?

Thanks,

Alex Strand

[removed\_email\_address@domain.invalid]  
Razorcom

> **[razorcom.com domain name is for sale. Inquire now.](https://www.razorcom.com/)**
>
> razorcom.com is available for purchase. Get in touch to discuss the possibilities!

* * *

Our company, Razorcom, is developing a product called LiquiPages.  
LiquiPages is a way for content owners to maintain their websites and  
publish changes from a centralized location. If you are interested  
in helping us with our beta test, please visit http://  
[www.liquipages.com/](http://www.liquipages.com/)

* * *

Visit the Razorcom Blog, Revolution Trigger, at:  
[http://www.razorcom.com/blog/](http://www.razorcom.com/blog/)

---

<div class="post-metadata">

**Author:** ![Razorcom](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/e68b1a/32.png) [@Razorcom](https://www.ruby-forum.com/u/Razorcom)\
**Post date:** [January 24, 2006, 6:32am UTC](https://www.ruby-forum.com/t/habtm-records-with-no-parents/53051/4 "2006-01-24T06:32:25Z")

</div>

On 2006-01-23 19:16:47 -0500, Razorcom  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) said:

> Well I think actually backwards… like, what posts have no authors?

I would strongly recommend agaisnt this method, which is very consuming  
in terms of processing. If your DBMS allows subqueries (mySQL 4.1+  
does, iirc), try the following:

Post.find :all, :conditions =\> “id NOT IN (SELECT DISTINCT post\_id FROM  
authors\_posts)”

This will give you an array of all Post objects whose ids do not show  
up in the join table.

The opposite (authors without any posts):

Author.find :all, :conditions =\> “id NOT IN (SELECT DISCINT author\_id  
FROM authors\_posts)”

This technique is MUCH faster, and you still get full-featured  
ActiveRecords objects. Don’t fear SQL when it can really help out 🙂

Note that you could also use a counter cache (see Rails api doc) if  
subqueries are not available.

Ben
