On Aug 23, 2010, at 4:15 PM, Colin L. wrote:
=> :people
this does group the families together and count the members,
but this has no way of including only families of one
I am assuming that the output from this could be used to get the name
field from households
It might be worth looking at counter_cache.
Colin
That might not be a bad idea (or even running a
Household.connection.select_value on the SQL).
Well, the answer is going to be different for ActiveRecord 2.x and 3.0
Here’s how it would look in SQL
SELECT COUNT(households.id) FROM households
INNER JOIN people ON people.household_id = households.id
GROUP BY households.id
HAVING COUNT(people.id) = 1
In AR 2.x, that’s probably:
Household
.count
(:include
:people
, :group=>‘households.id’, :having=>‘COUNT(people.id)=1’).first.first
or since the join is simple and not truly needed:
Person.count(:select => ‘people.id’, :group =>
‘people.household_id’, :having => ‘COUNT(id)=1’).first.first
(the return will be an array of pairs [count,1] so [[count,
1]].first.first will be count)
And in AR 3.0, something like:
Household
.select
(‘COUNT
(households
.id
)’).includes
(:people).group(‘households.id’).having(‘COUNT(people.id)=1’).to_a.size
-or-
Person
.select
(‘COUNT(id)’).group(‘household_id’).having(‘COUNT(id)=1’).to_a.size
You might be thinking “Hmm, ActiveRecord doesn’t seem to be well
suited for a query like this”
And I think you’d be right!
-Rob
Rob B.
[email protected] http://AgileConsultingLLC.com/
[email protected] http://GaslightSoftware.com/