You're right that activerecord won't help you much with this sort of stuff - you will be writing out a bunch of joins yourself (with the exception of 'parents with 2 children': you can use a counter_cache, at which point it becomes trivial).
To get all parents with no children, you need to be generating sql of the form
select parents.* from parents
left outer join children on children.parent_id = parents.id
where children.id IS NULL
if you want parents whose children match some condition
select parents.* from parents
inner join children on children.parent_id = parents.id
where <some conditions on children>
if you want parents with no children matching some condition
select parents.* from parents
left outer join children on children.parent_id = parents.id AND <some conditions on children>
where children.id IS NULL
You can tell activerecord what joins to apply with the :joins option