In Ruby-on-Rails, there is a handy one-liner that will allow you to find all the instances of one model that contain no instances of an associated model.
For example, lets say you have a model Blog that has a has_many relationship with Comments, and you come across a scenario where you want to find all blog posts that have no comments. The following line of code will do this for you:
Blog.includes(:comments).where( :comments => { :blog_id => nil } )
One note about this line of code: the .includes() expects the name of the association between the models, while .where() expects the name of the table. If the Blog model had a has_one relation with comments, then the line would be:
Blog.includes(:comment).where( :comments => { :blog_id => nil } )
Using .includes() lets you specify the relationships that you want included in your query results. This is usually better than a join, since it lets you access the attributes in the Comments model without performing an extra query[1].
Also, you can technically use any attribute in the Comment model and check if it's nil, since every field will return nil. Choosing the foreign key is preferred for readability.